2013-07-04 7 views
9

Dalla mia comprensione il comportamento predefinito di Backbone JS Models è quello di restituire l'URL della raccolta, a meno che il modello abbia un urlRoot specificato. Non riesco a far funzionare il comportamento.BackboneJS model.url utilizzando collection.url

Dalla documentazione:

model.url() ... genera URL della forma: "[collection.url]/[id]" per impostazione predefinita, ma è possibile ignorare specificando un esplicito urlRoot se la collezione del modello non deve essere presa in considerazione.

Ecco la mia collezione, e il modello, rispettivamente:

var MyCollection = Backbone.Collection.extend({ 
    model: Model, 
    initialize: function(options){ 
     this.options = options || {}; 
    }, 
    url: function(){ 
     return "/theurl/" + this.options.param; 
    } 
}); 
return MyCollection; 

...

var MyModel = Backbone.Model.extend({ 
    urlRoot: '/theurl', 
    initialize: function() { 
    } 
}); 
return MyModel; 

Quando un modello viene caricato senza una collezione, funziona benissimo e presenta al /theurl, ma quando viene caricato in una raccolta, tutti i metodi vengono inviati a /theurl/param/.

Se sto capendo correttamente la documentazione, il urlRoot del Modello dovrebbe sovrascrivere questo comportamento; e anche allora l'url dei modelli dovrebbe essere /theurl/param/{MODEL-ID}.

Qualche idea su cosa mi manca/incomprensione?

...

PS: Il model: Model della collezione è portato in via RequireJS

risposta

9

Sarà sempre utilizzare l'URL della collezione, anche se si dispone di urlRoot specificato.

Il motivo per urlRoot è quindi possibile utilizzarlo in una sostituzione o se il modello non si trova in una raccolta (ad esempio, può essere rimosso ma esiste ancora sul client).

Quindi, se si vuole fetch o save il modello e sovrascrivere l'url generata dalla raccolta è necessario passare il urlRoot in questi metodi in modo esplicito come opzione. Per esempio:

yourModel.save({ url: yourModel.urlRoot }); 

Sono d'accordo la documentazione è confusa e questo mi ha preso troppo di recente.

+0

Grazie per la risposta. La documentazione sembra super ambigua lì. Qualche idea sul motivo per cui non si aggiunge l'ID modello alla fine dell'URL della raccolta? – caleb

+0

Ci sono alcune cose. Hai appena creato il modello sul client? Se è così non avrà necessariamente un ID in quanto non è stato ancora salvato sul server. In questo caso avrà solo un cId. – dcarson

+2

Penso che questo dovrebbe invece dire: 'yourModel.save ({}, {url: yourModel.urlRoot});'. Il modo in cui è attualmente scritto sta per 'set' la proprietà' url' sull'oggetto perché il primo argomento di 'save' è un hash degli attributi. – flyingL123

1

UrlRoot deve essere una funzione e il modello deve avere attributeId definito. Se si definisce il modello in questo modo, tutte le operazioni funzioneranno se il modello è in raccolta o meno.

Backbone aggiungere modelId alla fine dell'URL restituito dalla funzione urlRoot.

var MyModel = Backbone.Model.extend({ 
    attributeId: 'myModelId' 
    urlRoot: function() { 
     return '/theurl'; 
    }, 
    initialize: function() { 
    } 
    defaults: { 
     myModelId: null 
    } 
}); 
+0

Ho appena provato questo impostando 'urlRoot' come una funzione invece di una stringa e non ha usato la funzione' urlRoot' del modello quando il modello era in una collezione e 'save' è stato chiamato sul modello. – dcarson

+0

se il modello è in collezione, viene utilizzato l'url di raccolta. urlRoot è solo quando il modello è fuori dalla collezione. – maketest

+0

Esattamente! Quel comportamento era ciò che la persona che poneva la domanda stava indagando perché era inaspettato per lui/lei. La documentazione è confusa e suggerisce che l'impostazione di 'urlRoot' significherà che il modello ** sempre ** utilizza l'urlRoot, anche quando è in una raccolta. Come ho detto nella mia risposta e hai appena detto nel tuo commento, questo non è effettivamente il caso. – dcarson

0

Nel modello, provare a utilizzare:

url: function() { 
    return 'your url goes here'; 
} 
Problemi correlati