繁体   English   中英

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

[英]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 答案的附录,但它足够长,我需要答案格式而不是评论格式。

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

    remove也可以代替destroy 请注意,当 model 被删除时, removedestroy火——首先destroy ,然后remove 这会传播到集合并反转顺序:首先remove ,然后destroy 例如

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

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

  3. 在 model 或集合中调用this.bind指的是 Underscore.js绑定,而不是jQuery/Zepto 的。 有什么不同? 我注意到的最大问题是,您不能在单个字符串中使用空格分隔指定多个事件。 例如

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

    此代码查找名为event1 event2...的事件。 在 jQuery 中,这会将回调绑定到event1event2 ……如果您想将 function 绑定到多个事件,请将其绑定到all事件或为每个事件调用一次bind 为此在 github 上提交了一个问题,所以这个问题有望改变。 现在(2011 年 11 月 17 日),请注意这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM