Javascript Backbone.js将更改事件绑定到模型内的集合
我是个新手,所以如果这个问题有点明显,请原谅。 我在模型内部的集合中遇到问题。当集合更改时,它不会在模型中注册为更改(并且不会保存) 我将我的模型设置为:Javascript Backbone.js将更改事件绑定到模型内的集合,javascript,jquery,backbone.js,Javascript,Jquery,Backbone.js,我是个新手,所以如果这个问题有点明显,请原谅。 我在模型内部的集合中遇到问题。当集合更改时,它不会在模型中注册为更改(并且不会保存) 我将我的模型设置为: var Article = Backbone.Model.extend({ defaults: { "emsID" : $('html').attr('id') }, initialize: function() { this.tags = new App.Collections.Tags
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 answer的一个附录,但足够长,我需要答案格式而不是注释格式
change
和add
,但是其他人也可能想要绑定到destroy
。可能还有其他事件(我还不是100%熟悉所有事件),因此绑定到all
将涵盖您的所有基础
删除
也可以代替销毁
。请注意,删除模型时,remove
和destroy
都会触发—首先destroy
,然后remove
。这会向上传播到集合并颠倒顺序:首先删除
,然后销毁
。例如
model event : destroy
model event : remove
collection event : destroy
collection event : remove
事件。stopPropagation
,则可以阻止该事件。如果事件处理程序返回false
,这是event.stopPropagation()的jQuery快捷方式;
event.preventDefault()代码>
this.bind
指的是下划线.js的bind,而不是jQuery/Zepto的。有什么区别?我注意到最大的一个问题是,不能在一个字符串中使用空格分隔指定多个事件。例如
this.bind('event1 event2 ...', ...)
此代码查找名为event1 event2…
的事件。在jQuery中,这会将回调绑定到event1
,event2
。。。如果要将函数绑定到多个事件,请将其绑定到all
或为每个事件调用bind
一次。github上有一个关于这个的文件,所以这一个有望改变。现在(2011年11月17日),请对此保持警惕很好,谢谢。是否可以通过从主模型视图更改集合来触发更改事件?看起来应该是这样,但是如果我调用
this.model.tags.add({p:“b”})代码>它不会触发事件。@AdTaylorchange
只处理集合内模型中属性的更改。您想同时绑定到更改
和添加
您是一名代理!为这样一个愚蠢的问题道歉。ThanksMinor point:访问主干属性的最佳实践不是使用get/set方法,而不是直接访问属性吗?换句话说:this.get(“tags”)
而不是this.tags
次要要点:我认为在示例中this.tags实际上不是一个模型属性。它将是一个名为“tags”的属性,在模型级别,与property属性处于同一级别,因此这个.get(“tags”)将为您提供一个未定义的属性。如果他做了一个this.attributes.tags=。。。或者this.set({tags:new App.Collections.tags()}),那么您对this.get('tags')的建议就行了。但是,一般来说,在处理模型属性时,正确的做法是使用.get()和.set()作为首选方法。:-)注意,从0.9.0开始,主干添加了对空格分隔事件的支持。参见变更日志: