2013-03-30 183 views
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'); 
} 
}); 

我需要檢查時,我填充集合,當我加入一個單一的模式,如果有已經與等於模型確定propperties現有的模型/我正在嘗試創建。 我已經試過這樣的事情:

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。

有什麼想法?

非常感謝!

+0

「*的事情是,它的工作原理,但是當我填充集合,它不是由應用程序填充。 Models.Booking,但帶有響應的JSON。*「請問你能更具體嗎? – Loamhoof

+1

哦,順便說一句,看來你無視任何東西重寫添加方法。調用add時,'merge'標誌設置爲false將具有這種確切的行爲。此外,事情是,默認情況下,爲add方法設置爲false。 – Loamhoof

+0

我想驗證集合上的新條目。我已經實現了驗證,但添加方法是添加平面JSON,而不是在集合中插入帶有JSON值的新模型。 – Pablo

回答

3

所以,基本上當你填充一個集合時,3個標誌描述了你的方法應該有的行爲:添加,刪除,合併。我們將通過一組的默認行爲開始並添加方法:

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

其實代理的一套方法add方法一樣,如果你不使用復位標誌的獲取方法(其中會導致刪除集合中的任何模型,並在每次獲取它們時創建新模型),而這會調用重置方法。

現在,如何使用標誌。那麼,這是指定的選項in the doc。所以基本上,Add方法的默認行爲是相同的:

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

現在,這些標誌的含義是:
- 增加:將增加的消息模型(=的那些他們的ID不中現有的...)到集合
- 刪除:將刪除舊的模型(=他們的ID不在提取的模型中)
- merge:將更新舊的和提取的

你應該瞭解的合併標誌:它是ASS中的一個真正的痛苦。真的,我討厭它。爲什麼?因爲它使用「準備模型」的內部功能:

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

這意味着它將創建假的易失模型。有什麼大不了的?那麼,這意味着它將執行這些易失性模型的初始化函數,可能會在您的應用程序中產生連鎖反應和不需要的行爲。

那麼,如果你想要這種行爲,但不能創建易失性模型,因爲它會破壞你的應用程序?嗯,你可以將混合標誌爲false,並覆蓋解析方法來做到這一點,是這樣的:

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; 
}