骨干收集验证

时间:2013-03-30 14:22:50

标签: javascript backbone.js

配合 我有以下内容:

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。

有什么想法吗?

非常感谢!

1 个答案:

答案 0 :(得分:3)

因此,基本上在填充集合时,3个标志正在描述您的方法应具有的行为:添加,删除,合并。我们将从set的默认行为开始并添加方法:

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

实际上,add方法代理set方法,如果不使用重置标志,则获取方法(这将导致删除集合中的任何模型并创建新模型你获取它们的时间),这将调用重置方法。

现在,如何使用标志。好吧,这是指定in the doc的选项。所以基本上,add方法的默认行为等同于:

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

现在,对于那些旗帜的含义:
- 添加:将新闻模型(=其ID不在现有的模型中)添加到集合中 - 删除:将删除集合中的旧模型(=其ID不在获取的模型中) - merge:将更新旧的和已获取的

中的属性

你应该了解合并标志:它是一个真正的痛苦。真的,我讨厌它。为什么?因为它使用“准备模型”的内部函数:

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

这意味着它会创建假的,易变的模型。有什么大不了的?嗯,这意味着它将执行那些易变模型的初始化函数,可能会在您的应用中产生连锁反应和不需要的行为。

那么,如果您想要这种行为但是因为它破坏了您的应用程序而无法创建易失性模型,该怎么办?好吧,您可以将merge标志设置为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;
}