我对Backbone很新,请原谅我这个问题有点明显。 我对模型中的集合有问题。当集合发生变化时,它不会在模型中注册为变更(并且不会保存)。
我已经设置了我的模型:
var Article = Backbone.Model.extend({
defaults: {
"emsID" : $('html').attr('id')
},
initialize: function() {
this.tags = new App.Collections.Tags();
},
url: '/editorial_dev.php/api/1/article/persist.json'
});
如果我更新标签集合并手动保存模型,这样可以正常工作:
this.model.tags.add({p : "a"});
this.model.save();
但是如果未保存模型,则视图不会注意到更改。谁能看到我做错了什么?
答案 0 :(得分:12)
initialize: function() {
this.tags = new App.Collections.Tags();
var model = this;
this.tags.bind("change", function() {
model.save();
});
},
绑定到内部集合上的change
事件,只需在外部模型上手动调用.save
。
答案 1 :(得分:4)
这实际上是@Raynos答案的附录,但是我需要答案格式而不是评论格式。
显然,OP希望绑定到change
和add
,但其他人也可能想要绑定到destroy
。可能还有其他事件(我还不是100%熟悉所有这些事件),因此绑定到all
将涵盖您的所有基础。
remove
也可以代替destroy
。请注意,删除模型后,remove
和destroy
都会触发 - 先destroy
,然后remove
。这会传播到集合并反转顺序:remove
首先,然后destroy
。 E.g。
model event : destroy
model event : remove
collection event : destroy
collection event : remove
this blog post中描述了自定义事件处理程序。
摘要:模型级事件应该传播到其集合,但如果某些事先处理事件并调用event.stopPropagation
,则可以阻止它们。如果事件处理程序返回false
,则这是event.stopPropagation();
event.preventDefault();
在模型或集合中调用this.bind
是指 Underscore.js 绑定, NOT jQuery / Zepto。有什么不同?我注意到的最大的一个是你不能用空格分隔在一个字符串中指定多个事件。 E.g。
this.bind('event1 event2 ...', ...)
此代码查找名为event1 event2 ...
的事件。在jQuery中,这会将回调绑定到event1
,event2
,...如果要将函数绑定到多个事件,请将其绑定到all
或调用bind
每次活动一次。在github上有一个issue为此提交,所以这个有希望改变。现在(11/17/2011),要小心这一点。