Ответ 1
Событие A change
запускается Backbone, когда атрибут изменяется через set
. Событие затем также запускается в коллекции, как вы видели. Но значение вашего атрибута subtabs
не изменяется вообще, это все тот же объект, который вы создали в defaults
. Если вы использовали tab.set('subtabs', new Subtabs);
, вы получили бы событие change:subtabs
, но вы не хотите этого делать.
Я думаю, вам нужно будет что-то сделать в своем коде, чтобы вызвать новое событие в вашей модели вкладки.
// Tab Model
var Tab = Backbone.Model.extend({
defaults: { label: undefined, subtabs: new Subtabs},
initialize: function(){
// listen for change in subtabs collection.
this.get('subtabs').on('change', this.subtabsChanged, this);
},
subtabsChanged: function(model) {
// trigger new event.
this.trigger('subtab:change', this, model);
}
});
Затем вы можете прослушать событие:
tabs.on('subtab:change', function(tab, subtab) {
console.log(tab.get('label'));
console.log(subtab.get('label'));
});
Это будет работать, я думаю. Но я думаю, мне интересно, почему вы будете слушать коллекцию вкладок для изменения Subtabs. В большинстве случаев было бы лучше просто прослушать событие изменения в самой коллекции Subtabs.
tab.get('subtabs').on('change', function(model){
// do something with model, which is a Subtab.
});