2013-12-03 56 views
0

通常我有一個觀點上,我設置監聽器模型的變化,像這樣(混爲一談):如何在引導/創建時將骨幹視圖與附加模型同步?

var jsonModel = {bla: 'interesting stuff'}; //some model in json, probably rendered in a dom-element and passed from the server to the client 

var someModelType = Backbone.RelationalModel.extend({ 
    bla: "String" 
}); 

var someModelInstance = new someModelType(jsonModel); 

var someViewType = Backbone.View.extend({ 

    initialize: function(){ 
    this.listenTo(this.model,'change:bla', function(model){ 
     //update view to sync with model change here 
    } 
    } 
}); 

var someViewInstance = new someViewType({ 
    model: someModelInstance 
}); 

我正在尋找最佳/骨幹網 - 自舉的觀點,即道:我想我的觀點(表單字段或你有什麼)與創建模型同步。由於模型是在視圖附加之前創建的,所以上述情況是不可能的,這會導致模型更新/更改在視圖初始化之前觸發。

當然,我可以編寫一些自定義的bootstapping邏輯,它可以手動調用監聽器函數,但是由於這必定是一個常見問題,所以我正在尋求一些最佳實踐建議,甚至更好的是一個Backbone-switch我需要設置這個工作。

回答

0

這聽起來很愚蠢,但我通常做的是在視圖創建後做一個render()。

對我而言,變更事件的全部要點是通知變更。事實上,它也是在創建時觸發的(作爲「相對於默認的變化」)是比任何深度更具副作用...

從這個意義上說,當我創建視圖並給它一個現有的模型,我期望模型有點準備好,所以我應該能夠立即做一個render()。所以,我的啓動代碼會更喜歡:

var someViewInstance = new someViewType({ 
    model: someModelInstance 
}); 
someViewInstance.render() 

還是做在綁定後初始化(),如果你覺得冒險(我個人不喜歡這樣,因爲與子視圖打交道時,很難知道什麼時候您希望渲染髮生,特別是當依賴於需要DOM準備好的庫,並且無法在分離的節點上工作時)。總之,雖然你的問題很常見,但對我而言,它並不需要任何複雜的解決方案:你有一個render()函數來將你的模型轉換成DOM-stuff,你的模型可能或可能沒有準備好,但它存在,所以你將它傳遞給視圖,並且在創建視圖之後手動執行第一次渲染,因爲你知道它需要發生。然後,您綁定到更改,以防您的模型更新,並相應地更新DOM。注意:對於模型集合,當Model沒有準備好ALL時,它可能甚至不應該有一個實例,並且您應該讓Collection爲您提供一些添加/刪除事件當它彈出存在時。