2012-03-27 87 views
14

考慮下面的代碼片段:爲什麼我的Backbone模型hasChanged()總是返回false?

var m = new Backbone.Model({ 
    name: 'joshua' 
}); 

m.set('name', 'something else'); 

如果我現在請m.hasChanged()m.hasChanged('name')我得到false爲什麼?我的理解是,這兩個應該返回true

m.changedAttributes()也返回false。

這裏是一個小提琴,說明我在做什麼,並期待:http://jsfiddle.net/9cvVv/88/

編輯:看來,除非你通過{ silent: true; }set()方法,然後將火在你的模型change事件,清除了changedAttributes()等。實質上,這些屬性僅跟蹤自上次觸發事件以來的更改。

我在文檔中閱讀過,但一開始並沒有真正理解它。

這對我來說似乎不是很有用。我將不勝感激任何解釋,爲什麼這種方式的工作方式,以及達到我想要的結果的最佳方式。 (繞過{silent: true; },並放棄change事件的用法似乎是一種浪費。)

回答

15

除非你傳遞{ silent: true; }set()方法,然後將這些本質上的火,你的模型,它會清除出changedAttributes()change事件屬性僅跟蹤自上次觸發change事件以來的更改。

所以答案是改爲調用此:

m.set('name', 'something else', {silent: true}) 
+0

嗯哼。我爲發送一批模型並返回的集合做了一個'save()'方法。想知道爲什麼hasChanged()似乎沒有做任何事情。 :-) 謝謝! – jmk2142 2012-03-28 23:16:03

+0

這在Backbone的新版本中不再是真的;看到我的答案。 – pimlottc 2014-04-02 18:51:51

+0

用骨幹0.9.2保存我的一天... – gor181 2016-01-27 16:16:51

-7

Model.set()需要一個屬性哈希作爲第一個參數。嘗試m.set({'name': 'something else'});。做m.set('name', 'something')沒有設置'名稱',所以它不會觸發change事件,您致電hasChanged()返回false。您可以通過註銷m.attributes來始終檢查屬性散列的當前值 - 雖然不建議直接訪問和操作它,因爲沒有任何更改事件會以這種方式觸發。

+1

錯了。 'Model.set()'支持像我使用的散列和單個屬性。該屬性正在設置,你可以在[稍微擴展的小提琴]中看到(http://jsfiddle.net/H2raK/1/)。這也是[在Backbone.js文檔中](http://backbonejs.org/#Model-set)。 – joshuapoehls 2012-03-27 16:41:07

+0

對不起,應該仔細閱讀。你想要做什麼?你可以綁定到模型'change'事件。通過這種方式,你可以檢查具體屬性的變化w/hasChanged(attr)'(看你是否需要更新視圖的某個部分)。我編輯了你的[小提琴](http://jsfiddle.net/H2raK/4/)來說明這一點。 – meirish 2012-03-27 17:49:43

+0

本質上,我試圖獲取自模型保存後更改的屬性列表。現在我通過'{silent:true}',然後檢查'changedAttributes()'。這完全符合我的需要,我只是希望Backbone更像數據模型中傳統的'isDirty'標誌。 – joshuapoehls 2012-03-27 18:26:54

11

這篇文章的前提是以前舊版Backbone的行爲。 hasChanged現在確實as of 0.9.10)總是返回trueset(..)被調用後。 silent標誌不再有任何作用。

這在使用Backbone.js的的CDN託管的副本總是使用最新版本的問題聯繫在一起的jsfiddle是容易混淆掩蓋。下面是顯示行爲的變化有些更新jsfiddles:

相關問題