2013-02-27 55 views
4

我對Backbone相當陌生,所以我進入了一些我無法弄清楚的問題。用ID數組過濾和排序骨幹集合

我有一個超過100個項目的Backbone集合。我想過濾這些與ID數組,這是工作正常,但我想這些項目的順序也基於這個數組的順序項目。這不起作用。其他排序方法似乎是基於asciibetical的,這不是我所需要的。是否有可能使用此過濾器獲取項目,然後也按照我定義的順序將它們放入集合中?

我的ID,我帶過濾器的陣列,該陣列是這樣的:

var dDefaultItems = ['1','2','146','3','4','9','26','8','96','10','11','54','145','273','38']; 

收集和過濾的代碼如下所示:

var ChannelCollection = Backbone.Collection.extend({   
    fetch : function() { 
     var params = _.extend({}, arguments, { 
      data : { 
       "groupnumber" : "1000" 
      } 
     }); 
     this.constructor.__super__.fetch.apply(this, [params]); 

    }, 

    model : Channel, 

    url : function() { 
     return utility.apiUrl('/myurl/tothething'); 
    }, 

    filterData: function(params) { 

     this.originalModels = this.models.slice(); 

     _.each(params, function(val, key){ 
      if (typeof val !== 'object') val = [ val ]; 
      this.models = _.filter(this.models, function(model){ 
       return _.indexOf(val, model.get(key)) !== -1; 
      }, this); 
     }, this); 
     return this.reset(this.models).toJSON(); 
    }, 

    parse : function(json) {    

     return json.channelInfoList; 
    } 

}); 

然後我呈現此在這個代碼的視圖中(還有其他一些代碼用於定義模型和其他屬性,我認爲這些代碼並不相關,我可能是錯的,但是我認爲有人會知道我需要從這個角度看問題。)

var ChannelListView = Backbone.View.extend({ 

    initialize: function() { 
     var _this = this; 

     currentChannelList = new ChannelCollection(); 

     currentChannelList.once("sync", function() { 
      _this.render(); 
     }); 

     currentChannelList.fetch(); 
    }, 
    render : function() { 
     var _this = this; 

     $(_this.el).empty(); 

    dust.render("list-channels", { channelList : currentChannelList.filterData({id: dDefaultItems})} , function(err, html) { 

     var $el = $(html).appendTo($(_this.el)); 
     }); 
    } 
}); 

回答

8

骨幹集合會自動按插入順序排序,除非您實施Collection#comparator。問題是你的過濾算法沒有產生一個有序的輸出。

如果你只需要維護一個有序集合的ID過濾的時候,我會建議實施單獨的方法,因爲SEACH由ID是比較遠快通過任意屬性進行搜索:

filterById: function(idArray) { 
    return this.reset(_.map(idArray, function(id) { return this.get(id); }, this)); 
} 

用法:

collection.filterById(['1', '2', '146', '3', '4', '9', '26', '8', '96', '10', '11', '54',' 145', '273', '38']); 
+0

正是我需要的,謝謝!我只是得到了JSON的結果才能使其工作100%。 – plebksig 2013-02-27 09:47:47

+0

這是一個非常聰明的方式來做到這一點。 – samccone 2013-12-24 02:28:29