1

私は次のものを持っています:

App.Collections.Bookings = Backbone.Collection.extend({
url: 'bookings/',
model: App.Models.Booking,

howManyArriving: function() {

    var bg = _.countBy( this.models, function(model) {
        return model.get('indate') == moment().format('YYYY-MM-DD') ? 'even' : 'odd';
    });

    var lv = _.filter( this.models, function(model){
        return model.get('indate') == moment().format('YYYY-MM-DD');
    });

    var r = {
        count: bg,
        models: lv
    }
    return r;
},

availableBtwn: function(bed,indate,outdate) {
    var gf = _.filter(this.models, function(model){
        return (
            model.get('outdate') > outdate &&
            model.get('indate') <= indate &&
            model.get('id_bed') == bed
        );
    });
    return gf;
},

getBooking: function(bed, date){

    var gf = _.filter(this.models, function(model){
        return (
            model.get('outdate') > date &&
            model.get('indate') <= date &&
            model.get('id_bed') == bed
        );
    });
    return gf;
},

getFullName: function(id){
    var b = this.get(id);
    return b.get('nombre') + ' ' + b.get('apellido');
}
});

コレクションにデータを入力するときと、単一のモデルを追加するときに、作成しようとしているモデルと等しい決定済みのプロパティを持つ既存のモデルが既に存在するかどうかを確認する必要があります。私はこのようなことを試しました:

App.Collections.Bookings.prototype.add = function(bookings) {
_.each( bookings, function(book){
    var isDupe = this.any(function(_book) { 
        return _book.get('id') === book.id;
    });
    if (isDupe) {
        //Up to you either return false or throw an exception or silently ignore
        return false;
    }else{
        Backbone.Collection.prototype.add.call(this, book);
    }
    //console.log('Cargo el guest: ' + guest.get('id'));
}, this);

}

問題は動作しますが、コレクションを作成すると、App.Models.Booking ではなく、応答の JSON が作成されます。

何か案が?

どうもありがとう!

4

1 に答える 1

3

したがって、基本的にコレクションにデータを入力するとき、3 つのフラグがメソッドの動作を記述します: add、remove、merge です。set メソッドと add メソッドのデフォルトの動作から始めます。

// Default options for `Collection#set`.
var setOptions = {add: true, remove: true, merge: true};
var addOptions = {add: true, merge: false, remove: false};

add メソッドは実際には set メソッドをプロキシし、reset フラグを使用しない場合は fetch メソッドもプロキシします (コレクション内のモデルを削除し、フェッチするたびに新しいモデルを作成します)。これにより、reset が呼び出されます。代わりにメソッド。

さて、フラグの使い方です。まあ、それは doc で指定されたオプションです。したがって、基本的に add メソッドのデフォルトの動作は次のようになります。

myCollection.add(myModels, {add: true, merge: false, remove: false});

これらのフラグの意味について:
- add: ニュース モデル (= ID が既存のモデルにないもの...) をコレクションに追加します
- remove: 古いモデル (= ID のモデル) を削除しますコレクションのフェッチされたモデルの中にありません)
- マージ: 古いものとフェッチされたものの属性を更新します

マージ フラグについて知っておくべきこと: IT'S A REAL PAIN IN THE ASS . 本当に、私はそれが嫌いです。なんで ?「モデルを準備する」内部関数を使用するため:

if (!(model = this._prepareModel(models[i], options))) continue;

これは、偽の不安定なモデルを作成することを意味します。大したことは何ですか?つまり、これらの揮発性モデルの初期化関数が実行され、アプリで連鎖反応と望ましくない動作が発生する可能性があります。

では、この動作が必要であるが、アプリが壊れてしまうために揮発性モデルを作成できない場合はどうすればよいでしょうか? マージ フラグを false に設定し、parse メソッドをオーバーライドして、次のようにすることができます。

parse: function(models) {
  for(var i=0; i<models.length; i++) {
    var model;
    if(model = this.get(models[i].id)) {
      model.set(models[i]);
    }
  }
  return models;
}
于 2013-03-30T14:55:04.810 に答える