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的一个附录,但足够长,我需要答案格式而不是注释格式

  • 显然OP想要绑定到这里的
    change
    add
    ,但是其他人也可能想要绑定到
    destroy
    。可能还有其他事件(我还不是100%熟悉所有事件),因此绑定到
    all
    将涵盖您的所有基础

    删除
    也可以代替
    销毁
    。请注意,删除模型时,
    remove
    destroy
    都会触发—首先
    destroy
    ,然后
    remove
    。这会向上传播到集合并颠倒顺序:
    首先删除
    ,然后
    销毁
    。例如

    model event      :      destroy
    model event      :      remove
    collection event :      destroy
    collection event :      remove
    
  • 中描述的自定义事件处理程序有一个gotcha

    摘要:模型级事件应该传播到它们的集合中,但是如果某个对象首先处理该事件并调用
    事件。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”})它不会触发事件。@AdTaylor
    change
    只处理集合内模型中属性的更改。您想同时绑定到
    更改
    添加
    您是一名代理!为这样一个愚蠢的问题道歉。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开始,主干添加了对空格分隔事件的支持。参见变更日志: