2013-03-18 15 views
11

Ho la seguente collezione Backbone.js:Come aggiornare il modello nella collezione?

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

Come posso aggiornare uno dei modelli della collezione in modo che posta al/api/v1/tag/id e salva i dati per quel modello.

Quindi, se cambio il nome del modello con ID 2 nella raccolta Si dovrebbe mettere a /API/v1/tag/2 con i seguenti dati: nome: nuovo nome id: 2

+0

Hai provato 'model.save ({nome: 'nuovo nome'});'? –

risposta

2

Puoi passare le variabili al metodo save. Accetta tutte le opzioni che il metodo di jQuery ajax usa (a meno che non overrided Backbone.Sync)

Si potrebbe fare qualcosa di simile:

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

Il metodo e PUT verrà automaticamente aggiunto da Backbone per voi.

+0

potresti utilizzare anche la patch HTTP per l'aggiornamento selettivo –

21

Ho anche recentemente desiderato aggiornare il modello particolare nella raccolta. Il problema era che se avessi usato solo model.save non ha aggiornato la collezione. L'obiettivo era quello di cambiare il modello in collezione, cambiarlo sul server, aggiornare la collezione di conseguenza e non utilizzare il metodo sync. Quindi ad esempio ho la mia variabile collection e voglio cambiare il modello con id = 2.

Quindi la prima cosa, mi creerà un modello di esempio, in questo modo:
var model = collection.get(2)

allora io aggiornare gli attributi su questo particolare modello:
model.set({name: 'new name'})

poi mi salvarlo al server:
model.save({}, {url:'/api/v1/tags/'+model.get('id')})

Poi dobbiamo aggiornare la raccolta di conseguenza alle modifiche:
collection.set({model},{remove: false})

metodo set - è un aggiornamento "intelligente" della raccolta con l'elenco dei modelli passati nei parametri.
remove: false parametro - è una restrizione per una raccolta per rimuovere i modelli esistenti nella raccolta. Più here.

7

La prima cosa che si può perdere è che nel modello Tag corrispondente è necessario impostare "urlRoot" in modo che corrisponda all'URL della raccolta. In caso contrario, non conosce la raccolta a tutti:

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

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

Questo è utile se si desidera salvare il tag separatamente:

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

Sulla raccolta, "create()" è anche " update() "se id non è nullo. Non è confuso. :) Quindi, questo è più o meno equivalente al campione precedente:

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

Questo aggiornerà il tag esistente con id = 2 e quindi innescare un PUT.

Questa è una domanda antica; rispondendo perché stavo cercando la stessa risposta - probabilmente hai da tempo risolto questo problema e proseguito. :)

Problemi correlati