2011-12-11 15 views
44

Ho scritto un modello/vista/raccolta utilizzando Backbone.js. La mia collezione utilizza il metodo fetch per caricare i modelli da un server remoto. L'url richiesto per questa raccolta richiede un ID come: messaggi/{id}. Ma non ho trovato un modo pulito per passare le opzioni alla raccolta.Opzioni di raccolta Backbone.js

La vista backbone.js accetta le opzioni passandole in costruzione: vista ([opzioni]), ma la raccolta prevede un elenco di modelli al momento della costruzione: raccolta ([modelli]).

Qual è il modo "più pulito" per passare parametri/opzioni a questa raccolta?

codice abbreviato:

var Messages = Backbone.Collection.extend({ 
model: Message, 
    url: 'http://url/messages/' + id 
}); 
+4

forse usare l'url relativo è un'idea migliore anche tu? – malletjo

risposta

107

@ risposta di Paolo è buona, ma è anche interessante notare che l'attributo url può essere una funzione. A mio parere (ed è solo opinione, dal momento che il risultato finale è lo stesso), il codice è un po 'più leggibile, se più verboso, se si imposta l'id nel initialize e il riferimento in una funzione:

var Messages = Backbone.Collection.extend({ 
    initialize: function(models, options) { 
    this.id = options.id; 
    }, 
    url: function() { 
    return '/messages/' + this.id; 
    }, 
    model: Message, 
}); 

var collection = new Messages([], { id: 2 }); 
collection.fetch(); 

Solo per essere sicuri, però - non stai confondendo il id qui con il modello id, vero? @ La risposta di Paolo, e il mio codice sopra, presuppongono che tu abbia più collezioni Messages, ognuna con il proprio ID. Se il percorso API /messages/<id> si riferisce a un messaggio , non un set di messaggi, quindi è sufficiente impostare url su /messages/ nella raccolta e Backbone utilizzerà automaticamente /messages/<id> per ciascun modello.

+3

Grazie 'Nick' per un esempio così semplice e chiaro. Vorrei aver visto la tua risposta, avrei salvato un giorno .... Grazie ancora. – Shubh

+0

Sì, questo risultato non è definito per me. La risposta sotto funziona. –

23

Il modo in cui si ha la proprietà url dichiarato, il valore sarà determinato una volta quando il browser carica inizialmente il file javascript, e sarà indefinito 'id'.

Il Backbone.Collection accetta le opzioni come secondo argomento nel suo costruttore, quindi è possibile passare il valore id come opzione e quindi impostare il valore di url all'interno della funzione di inizializzazione dell'insieme.

Ecco un esempio

var Messages = Backbone.Collection.extend({ 
    initialize: function(models, options) { 
    this.url = 'http://url/messages/' + options.id; 
    }, 
    model: Message, 
}); 

var collection = new Messages([], { id: 2 }); 
collection.fetch(); 
Problemi correlati