2012-10-15 14 views
8

Biorąc pod uwagę ten Backbone CollectionSzkielet: Jak sprawdzić, czy model już istnieje w kolekcji?

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

i dodanie nowego modelu z myślą droga poniżej, w jaki sposób mogę potwierdzić, czy model już istnieje w kolekcji?

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 nie pozwalają to zrobić :) zgłasza błąd (W każdym razie istnieje tylko niewielka zmienność Twoje modele i chcesz je zweryfikować, powiązać z zdarzeniem 'add' i tam potwierdzić) – Deeptechtons

+0

Nie mogę sobie poradzić jak potwierdzić to tak, jak mówisz. Zrobię to po stronie serwera. Dzięki Deeptechtons. – Aldo

+0

Wrócę z przykładem :), aby rozwiązać problem. – Deeptechtons

Odpowiedz

18

Serwery szkieletu służą do proxy funkcji iteracji Underscore.js, które są przydatne w takich przypadkach.

Jeśli masz istniejącej instancji modelu, aby sprawdzić, czy istnieje w kolekcji można po prostu zrobić coś takiego:

var myModel = new Floor(); 

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

Jeśli nie masz istniejącej instancji modelu, który z przykładu sugeruje może być przypadek, można użyć find lub findWhere podkreślenia funkcji, na przykład:

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

Jeśli find lub findWhere powrócić model, który można łatwo c heck przy użyciu porównania typeof, a następnie będziesz wiedzieć, czy model istnieje w kolekcji, czy nie.

+0

Witam, możemy użyć gdzie znaleźć, jeśli mamy sprawdzić cid – Pascal

+0

@Pascal: Nie możesz użyć funkcji 'findWhere', która jest śledzona przez Backbone w celu wyszukania model 'cid' jako własność' cid' nie jest atrybutem modelu. Aby to zrobić, musisz użyć natywnej funkcji 'find' w' '' 'var myModel = _.find (myCollection.models, function (model) {return model.cid ==" c15 ";});' – dcarson

+0

to pomogło – Pascal

0

findW przypadku kolekcji nie spowoduje to błędu JavaScript, ale nie znajdzie również modelu. Odpowiedni sposób sprawdzania, czy kolekcja zawiera model jest użycie podkreślenia Znajdźmy tak:

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 
} 
Powiązane problemy