2012-10-23 86 views
0

我有一个骨干集合,我想创建一个填充集合的方法。我发现的是推送方法,但这需要迭代所有项目:填充骨干中的集合

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; 
}); 

是否有任何其他解决方案? 我是新来的骨干,所以如果你看到任何错误 - 请告诉我。

+1

您可以使用接受模型或模型数组的[add](http://documentcloud.github.com/backbone/#Collection-add)方法。 – Jack

回答

5

至少有两种方法可以填充骨干集合,而无需在自己的代码中进行迭代。

方法添加(其中追加的模型,你传递)

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

0

看起来你想要一种方法来添加模型。最灵活的方式做到这一点是使用收集现有设置方法,传递任何所需的选项

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

的选项设置允许您控制会发生什么变化模型已经在集合(例如,当主要选项为:{add: false},{remove: false}{merge: false} - 请参阅http://backbonejs.org/#Collection-set - 这允许您仅更新现有型号({add:false}),更新和添加新型号({remove: false})。缺省值为{merge: true},它将在您添加的模型中合并,并通过您的数据数组传入。

您也可以使用重置方法,没有选项。这不太灵活,但是如果您只想清除集合的现有模型并添加传递的新模型,这是最简单的方法。它与集合不同,因为它不会为每个模型启动“添加”事件新增的模型。取决于你的观点如何运作,这可能会或可能不会有益。

由于它看起来好像你正在写一个搜索功能,增量添加/删除使用设置可能是动态更新结果视图有用触发的事件(你可以听的添加和删除事件采集)。骨干集合还有一个“更新”事件,每发起一次集合更改就会被触发一次,这会被集合加上触发,并可用于在您的视图中触发重投。