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

时间:2011-05-25 15:34:09

标签: javascript jquery backbone.js

我对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();

但是如果未保存模型,则视图不会注意到更改。谁能看到我做错了什么?

2 个答案:

答案 0 :(得分:12)

initialize: function() { 
    this.tags = new App.Collections.Tags();
    var model = this;
    this.tags.bind("change", function() {
        model.save();
    });
},

绑定到内部集合上的change事件,只需在外部模型上手动调用.save

答案 1 :(得分:4)

这实际上是@Raynos答案的附录,但是我需要答案格式而不是评论格式。

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

    remove也可以代替destroy。请注意,删除模型后,removedestroy都会触发 - 先destroy,然后remove。这会传播到集合并反转顺序:remove首先,然后destroy。 E.g。

    model event      :      destroy
    model event      :      remove
    collection event :      destroy
    collection event :      remove
    
  2. this blog post中描述了自定义事件处理程序。

    摘要:模型级事件应该传播到其集合,但如果某些事先处理事件并调用event.stopPropagation,则可以阻止它们。如果事件处理程序返回false,则这是event.stopPropagation(); event.preventDefault();

  3. 的jQuery快捷方式
  4. 在模型或集合中调用this.bind是指 Underscore.js 绑定, NOT jQuery / Zepto。有什么不同?我注意到的最大的一个是你不能用空格分隔在一个字符串中指定多个事件。 E.g。

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

    此代码查找名为event1 event2 ...的事件。在jQuery中,这会将回调绑定到event1event2,...如果要将函数绑定到多个事件,请将其绑定到all或调用bind每次活动一次。在github上有一个issue为此提交,所以这个有希望改变。现在(11/17/2011),要小心这一点。