15

コレクションから次のモデルまたは前のモデルを取得するいくつかの異なる方法を見てきましたが、それを実装することにした方法について誰かアドバイスを提供できるかどうか疑問に思っていました. 私のコレクションは順序付けされていますが、ソートしている ID が連続しているとは限りません。一意であることのみが保証されます。小さい ID はコレクションの「古い」エントリであり、大きい ID は「新しい」エントリであると想定します。

MyCollection = Backbone.Collection.extend({
  model: MyModel,
  initialize:function (){
    this.getElement = this._getElement(0);
  },
  comparator: function(model) {
    return model.get("id");
  },
  _getElement: function (index){
    var self = this;
    return function (what){
     if (what === "next"){
       if (index+1 >= self.length) return null;
       return self.at(++index);
     }
     if (what === "prev"){
       if (index-1 < 0 ) return null;
       return self.at(--index);
     }
     // what doesn't equal anything useful
     return null;
    };
  }
});

getElement を使用する場合、getElement("next") や getElement("prev") などを実行して、コレクション内の次または前のモデルを要求します。getElement から返されるのは、インデックスではなく実際のモデルです。collection.indexOf については知っていますが、最初にモデルを開始せずにコレクションをループする方法が必要でした。この実装は必要以上に難しいですか?

4

4 に答える 4

25

私はこのようなことをします。現在、エラー処理がないことに注意してください。そのため、現在コレクションの最初のモデルを使用していて、前のモデルを取得しようとすると、おそらくエラーが発生します。

MyCollection = Backbone.Collection.extend({
  model: MyModel,
  initialize:function (){
    this.bindAll(this);
    this.setElement(this.at(0));
  },
  comparator: function(model) {
    return model.get("id");
  },
  getElement: function() {
    return this.currentElement;
  },
  setElement: function(model) {
    this.currentElement = model;
  },
  next: function (){
    this.setElement(this.at(this.indexOf(this.getElement()) + 1));
    return this;
  },
  prev: function() {
    this.setElement(this.at(this.indexOf(this.getElement()) - 1));
    return this;
  }
});

次のモデルに進むためにcollection.next()。次の機種に進んで戻すにはvar m = collection.next().getElement();

次/前がどのように機能するかをもう少し詳しく説明します。

// The current model
this.getElement();
// Index of the current model in the collection
this.indexOf(this.getElement())
// Get the model either one before or one after where the current model is in the collection
this.at(this.indexOf(this.getElement()) + 1)
// Set the new model as the current model
this.setElement(this.at(this.indexOf(this.getElement()) + 1));
于 2012-04-18T02:41:06.823 に答える
6

コレクションではなくモデルにメソッドを追加するという点で、これは少し異なる方法で行いました。そうすれば、任意のモデルを取得して、シーケンス内の次のモデルを取得できます。

next: function () {
    if (this.collection) {
        return this.collection.at(this.collection.indexOf(this) + 1);
    }
},
prev: function () {
    if (this.collection) {
        return this.collection.at(this.collection.indexOf(this) - 1);
    }
},
于 2013-07-30T13:43:01.450 に答える
0

私のバックボーン SelectableCollection クラス:

Backbone.Collection.extend({
    selectNext: function () {
        if(this.cursor < this.length - 1) {
            this.cursor++;
            this.selected = this.at(this.cursor);
            this.trigger('selected', this.selected);
        }
    },

    selectPrevious: function () {
        if(this.cursor > 0) {
            this.cursor--;
            this.selected = this.at(this.cursor);
            this.trigger('selected', this.selected);
        }
    },
    selectById: function (id) {
        this.selected = this.get(id);
        this.cursor = this.indexOf(this.selected);
        this.trigger('selected', this.selected);
    },
    unselect: function () {
        this.cursor = null;
        this.selected = null;
        this.trigger('selected', null);
    }
});
于 2015-04-12T06:38:04.020 に答える