我正在使用Backbone.js跟蹤可視化應用程序中的狀態。四個Backbone.js模型問題
該模型具有的屬性,如:
indicatorX : "income"
indicatorY : "emissions"
indicatorXScale : "lin"
indicatorYScale : "log"
year : 1980
layout : {leftPanel : {[...]}, rightPanel : {[...]}}
1.什麼是在Backbone.js的模型處理「依賴屬性」的好辦法?
例如,當更改indicatorX屬性時,我還希望模型更新indicatorXScale屬性。
2.如何處理「揮之不去」模型屬性?例如:
該模型包含這樣的:
indicatorX : "income"
indicatorXScale : "log"
如果只有indicatorX設置在模型上,規模應設置爲默認值:
model.set({indicatorX : "emissions"})
if("indicatorX" in changedAttrs){
indicatorXScale = dataSource[indicatorX].defaultScale
}
然而,如果用戶想要什麼在「排放」指標的情況下,覆蓋默認比例「lin」?
model.set({indicatorX : "emissions", indicatorXScale : log})
由於模型屬性indicatorXScale已設置爲「log」,因此不會記錄更改後的屬性。那麼我如何確保defaultScale在這種情況下不會被加載 - 而是傳遞給模型的呢?
3.是否讓模型使用額外屬性「動作」來描述模型中的變化是一個好主意?
通過這種方式,控制器可以偵聽一個屬性,而不是爲屬性組合指定處理程序。這些都是備選方案:
備選1控制器,具有針對特定屬性的處理程序:
this.model.bind("change:year", this.render);
this.model.bind("change:layout", this.updateLayout);
Alt鍵2.控制器,具有針對模型的變化和渲染()計算出做什麼處理程序:
this.model.bind("change", this.render);
render() {
var changedAttributes = this.model.changedAttributes
if (a,b && c in changedAttributes) x()
if (a,d in changedAttributes) y()
}
Alt鍵3.讓模型來描述什麼屬性變化的組合表示:
this.model.bind("change:action", this.render);
render() {
var changedAttributes = this.model.changedAttributes
var action = this.model.get("action")
if (action == gui_changeIndicator) x()
if (action == gui_opacity) y()
}
4.在Backbone.js模型中使用對象作爲屬性時是否有任何缺陷需要注意?
在我試圖保留在模型中的佈局狀態上執行isEqual是否昂貴?另外,在設置模型時,對象是通過引用傳遞的,所以最好是比較起作用的新對象?
很好的回答! –
@Stephen:「希望至少有一點幫助!」不,這會有很大的幫助:)感謝您提供了一個非常好的答案。 關於我的3:rd問題,我仍在考慮使用額外的屬性「行動」...?能夠說「某些屬性變化的組合」等於「一個動作」將是一種方便。這不是讓每個控制器綁定到許多屬性,或者讓每個控制器都「高級如果邏輯」來查看哪些屬性發生了變化並調用必要的功能。相反,模型的邏輯ONCE和控制器可以監聽一個動作 - 比如scaleChange,layoutChange等。 – dani