免责声明:我是Backbone.js的新手(来自AngularJS),所以我可能有一个不准确的心理模型,说明它应该如何工作。
我有一个对象,characterNodes,我在我的模型上创建了一个属性。 characterNodes看起来像这样:
var characterNodes = {
character_1: {
stories: [// list of Stories]
},
character_2: {
stories: [// list of Stories]
}
...
}
My Backbone Model看起来像这样:
var StoryGraph = joint.dia.Graph.extend({
initialize: function() {
// Call parent constructor
StoryGraph.__super__.initialize.apply(this, []);
this.set('characterNodes', characterNodes);
this.on('change:characterNodes', function() {
alert('test');
});
}
});
每个故事都有一个属性" isUnlocked"在应用程序的其他地方更改。我希望在更改此属性时触发事件(即,即应弹出警报' test')。使用上面的代码,事件似乎永远不会触发。
我无法从Backbone文档中清楚地了解这是否应该有效 - 只要有任何属性(或子属性或子属性),就会触发('更改:characterNodes') -nub-property等)characterNodes的变化?或者只有当指向对象的指针发生变化时,即当它被另一个对象替换时?或者我做错了什么?谢谢!
答案 0 :(得分:0)
尝试调用函数而不是定义函数,并传递第三个参数以保持上下文调用。
这样的事情:
this.on('change:characterNodes', this.AlertSomething, this);
希望它有所帮助。
答案 1 :(得分:0)
Backbone没有做任何魔术,基本上,只有在将change
设置为新对象时才会触发"characterNodes"
事件。如果您正在更改该对象的嵌套属性,Backbone并不知道它发生了。您有三个选项:a)更改整个对象(例如,通过创建副本),b)每当您更改嵌套属性时手动触发change
事件(m.trigger("change:characterNodes")
),c)不要使用嵌套这个对象。有" character1_Stories"作为顶级酒店。
选项c)更可取。尽量保持模型中的属性平整。选项a)也没问题,但它的缺点是必须复制对象。不建议使用选项b)。这是因为Backbone会跟踪模型属性的先前值(m.previous("characterNodes")
)。如果更改嵌套属性,则前一个值将与新值具有相同的对象引用,因此,它不会反映其先前的状态。