Backbone.js将更改事件绑定到模型内的集合

Backbone.js binding a change event to a collection inside a model

本文关键字:模型 集合 绑定 事件 js Backbone      更新时间:2023-09-26

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

  1. 显然,OP希望在这里与changeadd结合,但其他人可能也希望与destroy结合。可能还有其他事件(我还不是100%熟悉所有事件),所以绑定到all将覆盖您的所有基础。

    CCD_ 7代替CCD_。请注意,删除模型时,removedestroy都会激发——首先是destroy,然后是remove。这会传播到集合并颠倒顺序:首先是remove,然后是destroy。例如

    model event      :      destroy
    model event      :      remove
    collection event :      destroy
    collection event :      remove
    
  2. 这篇博客文章中描述了一个具有自定义事件处理程序的gotcha。

    摘要:模型级别的事件应该传播到它们的集合,但如果有东西首先处理事件并调用event.stopPropagation,则可以阻止。如果事件处理程序返回false,这是event.stopPropagation(); event.preventDefault(); 的jQuery快捷方式

  3. 在模型或集合中调用this.bind是指Undercore.js的绑定,NOTjQuery/Zepto的绑定。有什么区别?我注意到的最大的一个问题是,不能在一个带有空格分隔的字符串中指定多个事件。例如

    this.bind('event1 event2 ...', ...)
    

    此代码查找名为event1 event2 ...的事件。在jQuery中,这将把回调绑定到event1event2。。。如果要将一个函数绑定到多个事件,请将其绑定到all或为每个事件调用bind一次。github上有一个问题,所以这个问题有望改变。目前(2011年11月17日),请对此保持警惕。