4

私はBackboneにまったく慣れていないので、理解できないいくつかの問題に直面しています。

100アイテムを少し超えるバックボーンコレクションがあります。これらをIDの配列でフィルタリングしたいのですが、これは正常に機能していますが、この配列のアイテムの順序にも基づいたアイテムの順序が必要です。それは機能していません。他のソート方法は、社会主義に基づいているようですが、それも私が必要としているものではありません。このフィルターを使用してアイテムを取得し、定義した順序でコレクションに入れることはできますか?

フィルタリングする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));
      });  
    }
 });   
4

1 に答える 1

8

バックボーンコレクションは、を実装しない限り、挿入順に自動的に並べ替えられますCollection#comparator。問題は、フィルタリングアルゴリズムが順序付けられた出力を生成していないことです。

idでフィルタリングする場合にのみ順序付けられたコレクションを維持する必要がある場合は、別のメソッドを実装することをお勧めします。これは、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']);
于 2013-02-27T09:18:34.990 に答える