2013-01-08 75 views
3

當我嘗試通過save更新Backbone中的模型時,模型上的更改事件被激發兩次。事件按這個順序被解僱。Backbone:模型上的兩個更改事件保存

  1. 變化
  2. 請求
  3. 變化
  4. 同步

然而,如果我通過(wait: true),僅第一change事件被觸發。

任何人都可以解釋爲什麼會發生這種情況嗎?我如何才能讓change只發射一次而沒有通過(wait: true)

兩個更改事件:

editItem: function() { 
     this.model.save({ 
      name: "Howard the Duck" 
     }); 
    } 

一個變化事件:

editItem: function() { 
     this.model.save({ 
      name: "Howard the Duck" 
     }, (wait: true); 
    } 

僞代碼:

App.Views.Item = Backbone.View.extend({ 
    initialize: function() { 
     this.model.on("change", this.changing, this); 
     this.model.on("request", this.requesting, this); 
     this.model.on("sync", this.syncing, this); 
    }, 

    events: { 
     "click a": "editItem" 
    }, 

    editItem: function() { 
     this.model.save({ 
      name: "Howard the Duck" 
     }); 
    } 

    changing: function() { 
     console.log("changing"); 
    },   

    requesting: function() { 
     console.log("requesting"); 
    }, 

    syncing: function() { 
     console.log("syncing"); 
    } 
}); 

回答

7

下面是當您保存模型,同時改變發生的事情分解屬性:

  1. model.set與作爲參數傳遞的數據
    觸發變化事件時options.wait是falsy
  2. XHR請求從服務器返回
  3. model.set與數據
    觸發變化事件時options.wait是truthy或服務器返回的數據不是型號知道的

您的服務器可能會返回一個修改後的屬性,從而觸發第二個更改事件。要麼修改你的迴應或限制你的活動與

this.model.on("change:name", this.changing, this); 

聽比較這些小提琴

+0

Blerg!感謝@nikoshr帶領我找到答案。因爲我的數據庫正在更新,所以我不認爲這是我的服務器上的任何內容。事實上,除了更新數據庫之外,我還返回了「true」:因此,有兩個更改事件。 – gojohnnygo

相關問題