2011-09-13 33 views
11

使用Backbone.js我知道強烈建議使用set方法來設置模型屬性,而不是直接修改attributes internal hashbackbone.js直接設置模型內部屬性散列

但是,除了不自動觸發「更改」事件,還有什麼其他缺點或「副作用」直接修改內部哈希?

我面臨的問題是,儘管set方法需要一個對象字面量,但我需要使用在運行時確定的變量來分配左側。謝謝。

myModel.set({ 
    myProperty : myValue; //myProperty is a variable, so this is invalid syntax 
}) 

//vs 

myModel.attributes[myProperty] = myValue; //myProperty is a variable that can be evaluated 

回答

15

好吧,如果你看一下annotated source code,你會發現,set做了很多。

如果你有一個功能,它會爲你延長Backbone.Model:

Backbone.Model.prototype.setByName = function(key, value, options) { 
    var setter = {}; 
    setter[key] = value; 
    this.set(setter, options); 
}; 

然後,你可以做你希望直接在模型上的內容:

var model = new Backbone.Model(); 
model.setByName(myProperty, "bar"); 

,感覺對我來說更好的解決方案。

編輯

正如@ earl3s指出,這已不再是較新版本的骨幹的需要。今天,你可以撥打model.set(myProperty, "bar"),它做你想做的。

+1

我認爲你的解決方案非常出色。這個功能應該被合併到更新的Backbone版本中!也感謝您指出註釋的源代碼;你是對的,我應該首先看看它。 – fortuneRice

+0

不錯!我已經寫了十幾遍這個代碼,從來沒有想過讓它成爲一種方法。 :)順便說一句:沒有必要使用_.extend這個。 'Backbone.Model.prototype.setByName = function(...){...}'做同樣的事情......在功能上是一樣的。只是一個不同的方式來做到這一點。 –

+0

@德里克貝利:滑稽......我以爲'_.extend'有一些額外的智慧來擴展原型......不。它真的是用一系列變化來擴展任何對象。沒有什麼瘋狂的。改變我的答案承認這一點。謝謝。 –

7

在Brian Genisio提到的annotated source code中,您可以閱讀以下行: 「處理」key「,value和{key:value}樣式參數。」。 所以你可以使用model.set(myProperty,「bar」,options)。 也許他們在Brian Genisio的帖子後加入了這個功能..我不知道。

+0

這是正確的解決方案。該功能已經存在於'set'方法中。 – earl3s