2013-03-08 40 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