Backbone.js多表数据操作

时间:2016-11-16 10:51:15

标签: javascript backbone.js backbone-events dom-manipulation backbone-collections

我的页面中有3个单独的表,它们都填充了View Initialize并从我的后端REST Api获取数据。获取数据后,我将重置绑定到名为paint的方法,并在该循环内部通过集合并构造表。

paintSelected: function (collection, options) {
    collection.each(function (ch) {
        var view = new ChannelViewDetailed({model: ch});
        view.setOwner(collection);
        this.$el.find('#selected tr:eq(' + collection.indexOf(ch) + ')').after(view.render().el);
    }, this);
},

这构造了我定义的下划线模板上的整个表。此时一切都很好,我可以处理此页面上多个集合之间的删除和添加数据。

当我想对这些表执行exclude allinclude all操作时,事情变得混乱,视图所有者因为我必须进行的循环而丢失,重复项显示在列表中订购迷失了。

ChannelViewDetailed = Backbone.View.extend({
    tagName: 'tr',
    template: _.template($('#tpl-channel-row-detailed').html()),

    events: {
        'click td.del': 'deleteSelected'
    },

    setOwner: function (collection) {
        this.owner = collection;
    },

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

    deleteSelected: function (e) {
        e.preventDefault();
        this.owner.remove(this.model);
        this.remove();
    }
});

请注意,上面提到的所有内容在执行每个项目操作时都能正常工作,但是当我不执行批处理(包括所有/排除所有操作)时,它没有按预期运行。

这是排除我尝试完成的所有方法的示例。

excludeAllChannels: function (e) {
        e.preventDefault();
        var self = this;

        if (!$.isEmptyObject(self.selected)) {
            _.each(this.selected.models, function (item, index, items) {
                self.selected.remove(item);
            });
            $('#in-channels tr').has('td').remove();
            unsavedState = true;
        }
    }

1 个答案:

答案 0 :(得分:3)

修改当前正在循环的数组可能会导致意外结果。

https://jsfiddle.net/c0xpzq6v/

var a = new Backbone.Collection(data);
_.each(a.models, function(item) { a.remove(item); });

可以替换为以下任何一种

_.each(_.clone(a.models), function(item) { a.remove(item); });
a.remove(a.models);
a.reset();