簡體   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