我试图围绕如何在CollectionView中呈现多个ItemView(每个具有单独的模型和模板)进行思考。 Marionette.js文档指定CollectionView支持单个ItemView。 我做这个假设是错误的,还是CollectionView可以支持这个假设? 如果没有,推荐什么? 预先感谢您的协助。

更新:

我添加了以下代码:

privObj.propertiesSubPanelView = new Marionette.CollectionView({
                    el: options.el,
                    collection: col,
                    getItemView: function( item ) {
                        console.log( item );
                    }
                });
privObj.propertiesSubPanelView.render.done( function() {
    console.log( 'Im done' );
});

这给出了以下错误:

An `itemView` must be specified

更新#2:

我已经在CollectionView中实现了getItemView函数,如下所示:

var ColView = Marionette.CollectionView.extend({
    collection: col,
    itemViews: views,

    getItemView: function( item ) {
        var viewId,
        itemViewObj,
        itemView;

        viewId = item.get( 'name' );
        itemViewObj = Marionette.getOption( this, 'itemViews' );
        itemView = itemViewObj[viewId];

        if ( _.isUndefined( itemView ) ) {
            throw new Error( 'No view associated with name: ' + viewId );
        }
        return itemView;
    }
});

var colView = new ColView();

var propLayout = new PropLayout();
propLayout.properties.show( colView );

但是,在以下情况下,我没有得到以下错误(未捕获的TypeError:对象不是函数):

Marionette.CollectionView.buildItemView: function(item, ItemViewType, itemViewOptions){
    var options = _.extend({model: item}, itemViewOptions);
    return new ItemViewType(options); <<== this line!
}

我错过了什么还是这是一个错误?

更新#3

这是我的主要功能...

           newPropertiesSubPanelCollection: function( col, views ) {
                var labelModel1 = new Backbone.Model({
                    name: 'Properties',
                    value: 'Properties',
                    data: undefined
                });
                var labelView1 = new Label_.Item();

                var labelModel2 = new Backbone.Model({
                    name: 'Configure',
                    value: 'Properties',
                    data: undefined
                });
                var labelView2 = new Label_.Item();

                var col = new Backbone.Collection();
                col.add( labelModel1 );
                col.add( labelModel2 );

                var views = {};
                views['Properties'] = labelView1;
                views['Configure'] = labelView2;

                var ColView = Marionette.CollectionView.extend({
                    collection: col,
                    itemViews: views,

                    getItemView: function( item ) {
                        var viewId,
                            itemViewObj,
                            itemView;

                        viewId = item.get( 'name' );
                        itemViewObj = Marionette.getOption( this, 'itemViews' );
                        itemView = itemViewObj[viewId];

                        if ( _.isUndefined( itemView ) ) {
                            throw new Error( 'No view associated with name: ' + viewId );
                        }
                        return itemView;
                    }
                });
                var colView = new ColView();
                return this.propertiesSubPanelCollection = colView;
            },

===============>>#1 票数:1 已采纳

查看https://github.com/marionettejs/backbone.marionette/blob/master/src/marionette.collectionview.js的源代码,我们可以看到:

getItemView: function(item){
    var itemView = Marionette.getOption(this, "itemView");

    if (!itemView){
        throwError("An `itemView` must be specified", "NoItemViewError");
    }
    return itemView;  
},  

这意味着默认情况下它将查找itemView属性。 但是,如果您覆盖此功能(如David Sulc所说),则可以在此处执行任何操作。 如果需要,可以为对象提供视图,例如:

privObj.propertiesSubPanelView = Marionette.CollectionView.extend({
    el: options.el,
    itemViews: {
        view1: itemView1,
        view2: itemView2 // etc..
    }
    getItemView: function( item ) {
        // Get the view key for this item
        var viewId = item.get('viewId');

        // Get all defined views for this CompositeView
        var itemViewObject = Marionette.getOption(this, "itemViews");

        // Get correct view using given key
        var itemView = itemViewObject[viewId];


        if (!itemView){
            throwError("An `itemView` must be specified", "NoItemViewError");
        }
        return itemView;
    }
});

// Create view instance
var viewInstance = new privObj.propertiesSubPanelView({
    collection: col
});

// Your model might have the following attribute
model.get('viewId'); // returns 'view1';

您的问题中还有另一个错误,那就是new Marionette.CollectionView({ 。您不能这样做,请参见上面的示例。您需要先扩展视图,然后在其上调用new关键字。

添加了一个展示上面代码的jsFiddle: http : //jsfiddle.net/Cardiff/L8xG9/

===============>>#2 票数:0

您可以根据模型定义getItemView以返回不同的项目视图: https : //github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.collectionview.md#collectionviews-getitemview

===============>>#3 票数:0

这是一些旧的骨干网和木偶库的问题。 我使用了以下库,它解决了该问题。

https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.2/backbone-min.js https://cdnjs.cloudflare.com/ajax/libs/backbone.marionette/2.4.5/backbone .marionette.min.js

  ask by Chris translate from so

未解决问题?本站智能推荐: