将项目从View添加到数组(backbone.js)

时间:2012-09-03 02:29:02

标签: javascript jquery backbone.js underscore.js

我在多步向导中有一个包含多个子视图ProductListView的父视图ProductView。当用户单击ProductView时,其模型的id应存储在某处(可能在数组中),以便可以将其发送回服务器端进行处理。

问题:我应该在哪里存储用户点击的id ProductView?我尝试将其存储在父视图ProductListView中,但似乎无法从子视图selectedProducts访问父视图中的数组ProductView

这是正确的做法吗?该怎么做?

模型

ProductCollection = Backbone.Collection.extend({
    model: Product,
    url: '/wizard'
});

家长视图

ProductListView = Backbone.View.extend({
    el: '#photo_list',

    selectedProducts: {},  // STORING SELECTED PRODUCTS IN THIS ARRAY

    initialize: function() {
        this.collection.bind('reset', this.render, this);
    },

    render: function() {
        this.collection.each(function(product, index){
            $(this.el).append(new ProductView({ model: product }).render().el);
        }, this);
        return this;
    }
});

子视图

ProductView = Backbone.View.extend({
    tagname: 'div',
    className: 'photo_box',

    events: {
        'click': 'toggleSelection'
    },

    template: _.template($('#tpl-PhotoListItemView').html()),

    render: function() {
        this.$el.html(this.template( this.model.toJSON() ));
        return this;
    },

    // ADDS ITS MODEL'S ID TO ARRAY
    toggleSelection: function() {
        this.parent.selectedProducts.push(this.model.id);
        console.log(this.parent.selectedProducts);
    }
});

2 个答案:

答案 0 :(得分:2)

我认为parent不是骨干View类型的属性,你还没有定义它,所以这条线路无法正常工作:

this.parent.selectedProducts.push(this.model.id);

似乎正确的方法是向selected模型添加Product属性;在单击处理程序中切换该属性。然后,当提交到服务器时,通过过滤所选项目的Products集合来收集ID(Backbone附带的underscore.js使这很容易)。

答案 1 :(得分:1)

为什么不直接在模型中尝试保留所选信息。那么,您将轻松跟踪所选事件的更改状态,并在进一步的向导步骤中使用该信息?

toggleSelection: function () {
    this.model.set({ selected: true });
}