2011-09-02 90 views
3

我正在使用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是否昂貴?另外,在設置模型時,對象是通過引用傳遞的,所以最好是比較起作用的新對象?

回答

10

1.什麼是在Backbone.js模型中處理「依賴屬性」的好方法?例如,當更改indicatorX屬性時,我還希望模型更新indicatorXScale屬性。

恕我直言,擴展模型並綁定到更改事件。例如:

MyModel = Backbone.Model.extend({ 
    initialize: function() { 
     this.bind('change:width', this.updateArea); 
     this.bind('change:height', this.updateArea); 
     this.updateArea(); 
    }, 
    updateArea: function() { 
     this.area = this.get('width') * this.get('height'); 
    } 
}); 

var model = new MyModel({height: 10, width: 10}); 
console.log(model.area); //100 
model.set({width: 15}); 
console.log(model.area); //150 

這是非常基本的,但改變事件每個鍵和作爲一個整體「變」叫..所以你可以綁定到特定的變化,並根據需要進行更新。如果它是一個大型模型,有很多間歇性更新的密鑰,這絕對是一種可行的方式。如果只是這兩個鍵......那麼你可能只需綁定一次常規的ol改變事件即可。

2.我該如何處理「徘徊」模型屬性?

重寫set方法並添加一些自己的代碼。例如:

MyModel = Backbone.Model.extend({ 
    constructor: function (obj) { 
     this.touched = {}; //Set before the prototype constructor for anything being set 
     Backbone.Model.prototype.constructor.call(this, obj); 
     //set after for only things that the program has updated. 
     return this; 
    }, 
    set: function(attributes, options) { 
     if(attributes.keyIWantToListenFor !== undefined && !this.touched.keyIWantToListenFor) { 
      console.log("keyIWantToListenFor was set, let's fire off the right methods"); 
      this.touched.keyIWantToListenFor = true; 
     } 
     Backbone.Model.prototype.set.call(this, attributes, options); 
     return this; 
    } 
}); 

var model = new MyModel({height: 10, width: 10}); 
model.set({keyIWantToListenFor: 15}); 

這使得在模型上保持絕對的「有鑰匙已設置」。它可能不夠具體,不足以滿足您的需求,但它確實有效。所以請隨時使用並徹底破解它。

3.是否讓模型使用額外的屬性「action」來描述模型中的變化是一個好主意?

骨幹人員設置它的方式是,如您所知,更改:key是特定於某個鍵上的更改事件。通過依靠更改:您可以在代碼中添加'gotcha!'。我看不出其他兩種方法比第一種更好,特別是考慮到現在您已經將邏輯拋入事件偵聽器來確定要觸發什麼。而不是將該代碼直接附加到適當的偵聽器。給出一個選擇,我會堅持第一個 - 這是一個清楚的「這個密鑰已更新,所以我們要做X」。不是「更新的東西,讓我們去弄清楚它是什麼!」並且可能必須經歷十幾條if語句或開關。

4.在Backbone.js模型中使用對象作爲屬性時是否有任何缺陷需要注意?

那麼,isEqual執行深度比較..所以你冒着做所有比較代碼和遞歸風險的風險。所以,是的,如果你做了很多次,那肯定會是一個陷阱。

通過引用的對象當然是一個問題 - 我在牆上有一個很好的小洞,我已經把我的頭幾次想知道爲什麼改變了一個完全無關的..哦,等待.. 爲了彌補這一點,你可以重寫get方法,以便在返回對象的情況下,返回類似$ .extend(true,{},this.get(key));

另外,您並不真正知道基於簡單Backbone的對象中究竟發生了什麼變化。因此,如果您在更改(重建視圖等)時做了很多「事情」,則即使您所做的只是向該對象添加了另一個屬性,但它不是可能會遇到性能問題用於任何所述更改。 (即set({layout:layoutObj})vs set({layoutPageTitle:'blah'}),它只能更新標題..而不是導致整個視圖重新加載)。除此之外,至少在我正在開發的應用程序中,我們對於主幹中的對象沒有真正的問題。它們同步得很好,並且比.get('layout.leftPanel [0]')好,並且有一些神奇的翻譯來使它工作。請注意參考部分。

希望至少有一點幫助!

+0

很好的回答! –

+0

@Stephen:「希望至少有一點幫助!」不,這會有很大的幫助:)感謝您提供了一個非常好的答案。 關於我的3:rd問題,我仍在考慮使用額外的屬性「行動」...?能夠說「某些屬性變化的組合」等於「一個動作」將是一種方便。這不是讓每個控制器綁定到許多屬性,或者讓每個控制器都「高級如果邏輯」來查看哪些屬性發生了變化並調用必要的功能。相反,模型的邏輯ONCE和控制器可以監聽一個動作 - 比如scaleChange,layoutChange等。 – dani