问题描述
|
我对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();
但是,如果未保存模型,则视图不会注意到更改。谁能看到我在做什么错?
解决方法
initialize: function() {
this.tags = new App.Collections.Tags();
var model = this;
this.tags.bind(\"change\",function() {
model.save();
});
},
绑定到内部集合上的change
事件,只需在外部模型上手动调用.save
。
,这实际上是@Raynos答案的附录,但是它足够长,我需要答案格式而不是注释格式。
显然,OP希望在此处绑定到change
和ѭ6but,但是其他人也可能希望绑定到destroy
。可能还有其他事件(我还不是100%熟悉所有事件),因此绑定到all
会覆盖您的所有基础。
remove
也可以代替destroy
工作。请注意,删除模型时,ѭ9和ѭ7都会触发,首先是ѭ7,然后是ѭ9。这会传播到集合并颠倒顺序:先是remove
,然后是destroy
。例如。
model event : destroy
model event : remove
collection event : destroy
collection event : remove
在此博客文章中描述了一个带有自定义事件处理程序的陷阱。
简介:模型级事件应传播到其集合,但是如果某些事物首先处理该事件并调用event.stopPropagation
,则可以避免该事件。如果事件处理程序返回false
,则这是event.stopPropagation();
event.preventDefault();
的jQuery快捷方式
在模型或集合中调用“ 21”是指Underscore.js的绑定,而不是jQuery / Zepto的绑定。有什么不同?我注意到的最大问题是,您不能在单个字符串中使用空格分隔来指定多个事件。例如。
this.bind(\'event1 event2 ...\',...)
该代码查找名为event1 event2 ...
的事件。在jQuery中,这会将回调绑定到event1
,event2
,...。如果要将函数绑定到多个事件,请将其绑定到all
或为每个事件调用一次bind
。在github上有一个与此相关的问题,所以这个问题有望改变。目前(2011年11月17日),请注意这一点。