2013-03-18 15 views
11

Mam następujący backbone.js kolekcję:Jak zaktualizować model w kolekcji?

var Tags = Backbone.Collection.extend({ 
     url: "/api/v1/tags/" 
}), 

Jak zaktualizować jeden z modeli w kolekcji tak, że odwiedzających do/api/v1/tagów/ID i zapisuje dane dla tego modelu.

Więc jeśli mogę zmienić nazwę modelu o identyfikatorze 2 w zbiorach należy umieścić go do /api/v1/tags/2 z następującymi danymi: name: Nowa nazwa id: 2

+0

Czy wypróbowałeś 'model.save ({name: 'new name'});'? –

Odpowiedz

2

Można przekazać zmienne do metody save. Akceptuje wszystkie opcje, które wykorzystuje ajax metoda jQuery (chyba overrided Backbone.Sync)

Można zrobić coś takiego:

model.save({ name:'new name' });

Metoda id i PUT zostanie automatycznie dodana przez Ciebie do Trybu szkieletowego.

+0

można również użyć poprawki HTTP do selektywnej aktualizacji –

21

Niedawno również chciałem zaktualizować konkretny model w kolekcji. Problem polegał na tym, że jeśli użyłem tylko model.save, nie zaktualizowałem kolekcji. Celem było zmienić model w kolekcji, zmienić go na serwerze, odpowiednio zaktualizować kolekcję i nie używać metody sync. Na przykład mam zmienną collection i chcę zmienić model z id = 2.

Więc pierwszą rzeczą, będę tworzyć model instancji, podobnie jak to:
var model = collection.get(2)

Wtedy będę aktualizować atrybuty dotyczące tego konkretnego modelu
model.set({name: 'new name'})

Wtedy będę go zapisać na serwerze:
model.save({}, {url:'/api/v1/tags/'+model.get('id')})

Następnie musimy zaktualizować kolekcję zgodnie ze zmianami:
collection.set({model},{remove: false})

set metoda - to "inteligentna" aktualizacja kolekcji z listą modeli, które przekazaliście w parametrach.
Parametr remove: false - ograniczenie kolekcji do usuwania istniejących modeli z kolekcji. Więcej here.

7

Pierwszą rzeczą, którą możesz przegapić, jest to, że w odpowiednim modelu tagu musisz ustawić "urlRoot", aby pasował do "url" kolekcji. W przeciwnym razie nie wie o kolekcji na wszystkich:

var Tag = Backbone.Model.extend({ 
    urlRoot: "/api/v1/tags" 
}); 

var Tags = Backbone.Collection.Extend({ 
    model: Tag, 
    url: "/api/v1/tags" 
}); 

Jest to przydatne jeśli chcesz zapisać tag oddzielnie:

var tag = collection.get(2); 
tag.set({key: "something"}); 
tag.save(); // model.save works because you set "urlRoot" 

Z kolekcji „create()” jest również " update() "jeśli id ​​nie jest zerowy. To nie jest mylące. :) W związku z tym, jest to dość dużo równoważna poprzedniej próbki:

collection.create({id: 2; key: "something"}); 

To będzie zaktualizować istniejący tag id = 2, a następnie wywołać PUT.

To jest starożytne pytanie; odpowiadając, ponieważ szukałem tej samej odpowiedzi - prawdopodobnie już dawno rozwiązałeś ten problem i ruszysz dalej. :)

Powiązane problemy