[英]Backbone.js binding a change event to a collection inside a model
我对 Backbone 很陌生,所以如果这个问题有点明显,请原谅。 我在 model 内的集合出现问题。 当集合更改时,它不会在 model 中注册为更改(并且不会保存)。
我已经像这样设置了我的 model:
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'
});
如果我更新标签集合并手动保存 model,这可以正常工作:
this.model.tags.add({p : "a"});
this.model.save();
但如果 model 未保存,则视图不会注意到更改。 谁能看到我做错了什么?
initialize: function() {
this.tags = new App.Collections.Tags();
var model = this;
this.tags.bind("change", function() {
model.save();
});
},
绑定到内部集合上的change
事件,然后手动调用外部 model 上的.save
。
这实际上是@Raynos 答案的附录,但它足够长,我需要答案格式而不是评论格式。
显然 OP 想在这里绑定change
和add
,但其他人可能也想绑定destroy
。 可能还有其他事件(我还不是 100% 熟悉所有事件),因此绑定到all
事件将涵盖您的所有基础。
remove
也可以代替destroy
。 请注意,当 model 被删除时, remove
和destroy
火——首先destroy
,然后remove
。 这会传播到集合并反转顺序:首先remove
,然后destroy
。 例如
model event: destroy model event: remove collection event: destroy collection event: remove
这篇博文中描述了一个带有自定义事件处理程序的陷阱。
摘要:模型级事件应该传播到它们的集合,但如果某些东西首先处理事件并调用event.stopPropagation
,则可以阻止它。 如果事件处理程序返回false
,则这是event.stopPropagation(); event.preventDefault();
event.stopPropagation(); event.preventDefault();
在 model 或集合中调用this.bind
指的是 Underscore.js的绑定,而不是jQuery/Zepto 的。 有什么不同? 我注意到的最大问题是,您不能在单个字符串中使用空格分隔指定多个事件。 例如
this.bind('event1 event2...', ...)
此代码查找名为event1 event2...
的事件。 在 jQuery 中,这会将回调绑定到event1
、 event2
……如果您想将 function 绑定到多个事件,请将其绑定到all
事件或为每个事件调用一次bind
。 为此在 github 上提交了一个问题,所以这个问题有望改变。 现在(2011 年 11 月 17 日),请注意这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.