2012-10-15 38 views
8

鑑於這種骨幹網收集Backbone:如何驗證模型是否已存在於集合中?

define [ 
    'underscore', 
    'backbone', 
    'cs!models/floor' 
], (_, Backbone, Floor) -> 
return Backbone.Collection.extend 
    model: Floor 
    url: -> 
    return '/api/hotels/' + @hotelId + '/floors' 
    initialize: (models, options) -> 
    if (options.hotelId) 
     @hotelId = options.hotelId 
     @.fetch() 

    parse: (response) -> 
    response.floors 

    alreadyExist: -> 
    @.filter((floor) -> 
     return floor.get('number') == @.attrs.get('number') 
    ) 

,並從視圖通過以下方式,我如何可以驗證,如果模型集合中已經存在添加的新模式?

add_floor: (e) -> 
    console.log ' Saving Floor ' 
    e.preventDefault() 
    floorNumber = $('input[name=floorNumber]').val() 
    floorDescription = $('input[name=floorDescription]').val() 
    return new NoticeView({ message: "Please enter a Floor Number.", displayLength: 10000 }) unless floorNumber 
    if ! @collection.add({ number: floorNumber}).alreadyExist() 
    @collection.create({ number: floorNumber, description: floorDescription }, { 
     error: (model, response) -> 
     # $(e.target).removeClass('waiting'); 
     new ErrorView({ message: "Problem saving Floor " + response.responseText, displayLength: 10000 }) 
     success : (model, response) -> 
     console.log model 
     console.log response 
     new NoticeView({ message: "Floor successfully saved.", displayLength: 10000 }) 
    }) 
    else 
    new ErrorView({ message: "Floor already exist." + response.responseText,  displayLength: 10000 }) 
+0

集合不允許你這樣做:)它拋出一個錯誤(在任何情況下也只是在一個小變化你的模型,你想驗證它,綁定到'add'事件並在那裏驗證) – Deeptechtons

+0

我不知道如何按照你說的方式驗證它。我會做服務器端。感謝Deeptechtons。 – Aldo

+0

我會回來一個例子:),以便它可以解決問題 – Deeptechtons

回答

18

骨幹集合代理了在這些情況下很有用的Underscore.js迭代函數。

如果您有現成的模型實例,以檢查它是否存在收集你可以做這樣的事情在:

var myModel = new Floor(); 

// the following line logs true if model is in collection, false if not. 
console.log(myCollection.contains(myModel)); 

如果沒有模式,現有的實例,它從你的榜樣提示可能是這種情況,你可以使用findfindWhere強調功能,例如:

var floorNumber = $('input[name=floorNumber]').val() 
var myModel = myCollection.findWhere({ floorNumber: floorNumber }); 

如果findfindWhere返回一個模型,你可以很容易ç heck使用typeof比較,那麼你會知道該模型是否存在於集合中。

+0

我們可以使用findwhere,如果我們檢查cid – Pascal

+0

@Pascal:你不能使用由Backbone代理的findWhere函數來搜索模型的'cid'作爲'cid'屬性不是模型屬性。要做到這一點,你需要使用本地的Underscore'find'函數,像這樣'var myModel = _.find(myCollection.models,function(model){return model.cid ==「c15」;});' – dcarson

+0

Thanks這有幫助 – Pascal

0

findWhere集合不會導致JavaScript錯誤,但不會找到模型。檢查如果一個集合包含一個模型的正確方法是用強調的發現是這樣的:

var model = _.find(collection.models, function (model) { return model.id == 

id_to_be_searched; }); 
var found = collection.contains(model); 

if (found) { 
    // do stuff 
} 
else { 
    // do stuff 
} 
相關問題