0

我有一个骨干集合,我想创建一个填充集合的方法。我发现的是 push 方法,但这需要遍历所有项目:

define([
    ...
], function($, _, Backbone, imagesCollection, imageTemplate, gridView) {
    var AppView = Backbone.View.extend({
        el: '#container',
        template: _.template( imageTemplate ),
        events: {
            'click #search': 'search'
        },
        initialize: function() {
            this.input = this.$('#search-term');
        },
        populate: function(data) {
                for (var i=0;i<data.length;i++) {
                    imagesCollection.push(data[i]);
                }
                //IS THERE ANY WAY TO PREVENT ITERATING OVER ALL THE ITEMS?
        },
        search: function() {
            $.ajax({
                type: 'get',
                url: myurl,
                dataType:'jsonp',
                success: function(response){
                    populate(response);
                }
            });
        }
    });

    return AppView;
});

还有其他解决方案吗?我是骨干新手,所以如果您发现任何问题 - 请告诉我。

4

2 回答 2

5

至少有两种方法可以在不迭代我自己的代码的情况下填充主干集合。

方法add附加您传入的模型)

populate: function(data) {
    imagesCollection.add(data); // old models will be preserved
}

方法重置(将集合中的所有模型替换为您提供的新模型)

populate: function(data) {
    imagesCollection.reset(data); // new models will erase the old ones
}

请参阅http://backbonejs.org/#Collection-resethttp://backbonejs.org/#Collection-add

于 2012-10-23T14:04:22.193 回答
1

看起来您想要一种添加模型的方法。最灵活的方法是使用集合现有的set方法,传递任何必需的选项

populate: function(data, options) {
    imagesCollection.set(data, options);
}

set的选项允许您控制集合中已经存在的模型发生的情况(例如,当再次调用 populate 时),主要选项是: {add: false}、、{remove: false}{merge: false}- 请参阅http://backbonejs.org/#Collection-set - 这允许您仅更新现有模型 ( {add:false}),更新和添加新模型 ( {remove: false})。默认值{merge: true}将合并到您正在添加的模型中,并通过您的数据数组传入。

您也可以使用没有选项的重置方法。这不太灵活,但如果您只想清除集合的现有模型并添加您传入的新模型,这是最简单的方法。它与set不同,它不会为每个新模型触发“添加”事件这是添加的。根据您的观点如何运作,这可能有益也可能无益。

鉴于您正在编写搜索功能,使用set触发的增量添加/删除事件可能对动态更新结果视图很有用(您可以监听集合上的添加和删除事件)。骨干集合还有一个“更新”事件,每组集合更改只触发一次,将由setadd触发,并可用于在您的视图上触发重新渲染。

于 2015-12-29T14:40:25.733 回答