2013-03-08 39 views
3

「未定義」我有一個CompositeView中和ItemViews如下(簡化自己的看法版):Marionette.js:CompositeView中:getItemView總是返回在初始化

testView1 = Backbone.Marionette.ItemView.extend({ 
    template: '#test-view-1' 
} 
testView2 = Backbone.Marionette.ItemView.extend({ 
    template: '#test-view-2' 
} 

TestView = Backbone.Marionette.CompositeView.extend({ 
    template: '#test-template', 
    itemViewContainer:'tbody', 
    itemView: testView1, 
    getItemView: function(item){ 
     console.log('item');  //<==== FIRED 101 TIMES 
     if (!item) {    //<==== WHY DO I NEED THIS 
      return testView1;  //<==== WHY DO I NEED THIS 
     } else { 
      return ('testView' + item.id); 
     } 
    } 
}); 

的問題是,當CompositeView中的初始化,它運行getItemView代碼之前,它將一個item傳入它,產生一個錯誤。沒有if條件,我已經添加,視圖中斷。

傳遞到合成視圖的我的集合包含100個模型,並且console.log('item');被觸發101次,第一次總是'未定義',其餘100次是100個模型。

我的問題是,爲什麼我需要檢查item是否每次都存在,有什麼我可以做,以避免需要此檢查?

+0

這只是一個猜測,但也許你已經完全從服務器獲取之前傳遞給複合視圖構造函數一個集合? – Ingro 2013-03-08 23:49:23

+0

@Ingro,CollectionView正在從我的集合獲取的'success:function()'創建。問題出現時收集完成。我期望在我的集合中有100個模型,這就是我所得到的,但'getItemView'被激發101次。謝謝您的意見。 – CREO 2013-03-09 00:03:22

回答

2

我在我的代碼中使用您的自定義getItemView函數嘗試並獲得相同的行爲。

跟蹤似乎getItemView在CompositeView中的構造函數分配給你傳遞給CompositeView中的對象ItemView控件獲取調用一次通話:this.itemView = this.getItemView();

因此,我認爲你是對的,如果一個項目是通過檢查做在返回正確的itemView實例之前。

+0

我同意做'if'條件是正確的行爲,並且在檢查時它運行良好。然而,對於我來說,在CompositeView開始迭代傳入的模型之前,我看不到需要調用getItemView'。這似乎是Marionette庫中的一個缺陷。我會保留我的支票,但是'hacky'似乎是。感謝您花時間研究這個問題。 @Ingro – CREO 2013-03-11 17:15:12