2012-10-15 10 views
8

Dato questo Backbone CollectionBackbone: come convalidare se un modello esiste già in una collezione?

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

e l'aggiunta di un nuovo modello da un punto di vista ben al di sotto, come posso validare se il modello esiste già all'interno della collezione?

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

Collection non consente di farlo :) esso genera un errore (in ogni caso non v'è solo una variazione minore in i tuoi modelli e vuoi convalidarli, associarli all'evento 'add' e convalidare laggiù) – Deeptechtons

+0

Non riesco a capire come convalidarlo come dici tu. Lo farò lato server. Grazie Deeptechtons. – Aldo

+0

tornerò con un esempio :) in modo che risolva il problema. – Deeptechtons

risposta

18

Backbone collections proxy le funzioni di iterazione di Underscore.js che sono utili in questi casi.

Se si dispone di un'istanza modello esistente, per verificare se esiste nella collezione si può semplicemente fare qualcosa di simile:

var myModel = new Floor(); 

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

Se non si dispone di un'istanza esistente del modello, che dal vostro esempio suggerisce può essere il caso, è possibile utilizzare la find o findWhere sottolineano funzioni, ad esempio:

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

Se find o findWhere restituire un modello, che si potrebbe facilmente c diamine usando un confronto typeof, allora saprai se il modello esiste o meno nella collezione.

+0

Ciao possiamo usare findwhere se stiamo controllando per cid – Pascal

+0

@Pascal: Non è possibile utilizzare la funzione 'findWhere' inviata da Backbone per cercare un il modello 'cid' come la proprietà' cid' non è un attributo di modello. Per fare questo è necessario utilizzare la funzione di ricerca 'find' nativa come questo' var myModel = _.find (myCollection.models, function (model) {return model.cid == "c15";}); ' – dcarson

+0

Grazie quello ha aiutato – Pascal

0

findWhere su una raccolta non provocherà l'errore JavaScript ma non troverà nemmeno un modello. Un modo corretto di verificare se una collezione contiene un modello è quello di utilizzare sottolineare di trovare in questo modo:

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 
} 
Problemi correlati