2012-10-15 5 views
8

は、このバックボーンコレクションバックボーン:モデルが既にコレクションに存在するかどうかを検証する方法は?

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

を、どのあなたの例から、モデルを返すfind場合、またはfindWhere

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

たあなたは簡単にCでした:場合であってもよいし、あなたが例えば、findまたはfindWhereアンダースコア機能を使用することができます示唆ちょうどtypeofの比較を使用すると、そのモデルがコレクションに存在するかどうかを知ることができます。

+0

私たちがcidをチェックするなら、findwhereを使うことができます – Pascal

+0

@Pascal:バックボーンによってプロキシされた 'findWhere'関数を使って、モデルの 'cid'は' cid'プロパティとしてモデル属性ではありません。これを行うには、以下のようなネストアンダースコア 'find'関数を使う必要があります。var myModel = _.find(myCollection.models、function(model){return model.cid ==" c15 ";});' – dcarson

+0

ありがとうそれが助けになった – 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 
} 
関連する問題