2013-05-31 20 views
26

Se ho un modello denominato "Libro" e una collezione denominata "Biblioteca", definito come di seguito:Backbone I modelli JS e Collezione URL

Prenota

app.Book = Backbone.Model.extend({ 
    defaults: { 
     title: 'No title', 
     author: 'Unknown' 
    } 
}); 

Biblioteca

app.Library = Backbone.Collection.extend({ 
    model: app.Book, 
    url: '/api/books' 
}); 

Quando Chiamo BookInstance.save() come viene visualizzato l'URL da utilizzare? Deriva dalla collezione?

In Backbone.model ci sono 2 opzioni: url e urlRoot. Qual è lo scopo e la differenza tra questi?

In Backbone.collection, esiste un singolo parametro url. Questa è sempre la richiesta GET per l'api RESTFUL?

risposta

35

Fondamentalmente, ci sono 3 possibilità di costruire l'URL di un modello:

  • Se l'oggetto modello esiste in una collezione allora il suo metodo url restituirà un indirizzo composto dal collection.url e model.id: [collection.url]/[id].

  • Se non si desidera utilizzare un modello all'interno della collezione, allora il valore s' model.urlRoot può essere usato al posto del frammento collection.url, con conseguente il seguente schema: [urlRoot]/[id].

  • Infine, se NON si intende mantenere più un modello di un determinato tipo sul server o verranno definiti gli URL per ciascun modello al momento della loro creazione, è possibile assegnare direttamente un valore a model.url.

Le raccolte inviano solo richieste GET - per ottenere un array di dati JSON dei modelli. Per il salvataggio, la rimozione e l'aggiornamento, vengono utilizzati i metodi save() (POST/PUT/PATCH) e (DELETE) del singolo modello.

Here's the source code of Backbone.Model.url, che dovrebbe aiutare a:

url: function() { 
    var base = 
    _.result(this, 'urlRoot') || 
    _.result(this.collection, 'url') || 
    urlError(); 
    if (this.isNew()) return base; 
    var id = this.get(this.idAttribute); 
    return base.replace(/[^\/]$/, '$&/') + encodeURIComponent(id); 
} 
+0

fa un backbone.model che si trova all'interno di una collezione di utilizzare la proprietà Backbone.Collection.url per determinare l'URL di salvare, aggiornare o rimuovere? –

+0

Esso utilizza per ogni operazione. – mirrormx

+0

check-out [questo] (http://stackoverflow.com/questions/17461264/backbonejs-model-url-using-collection-url). è possibile sovrascrivere le impostazioni URL cioè yourModel.save ({url: yourModel.urlRoot + yourModel.get ("id")}); – oak

12

Nel modello

  1. UrlRoot viene utilizzato per il modello.
  2. url viene utilizzato per l'istanza del modello.

Quindi, se UrlRoot esiste poi libro.fetch() recuperare i dati riportati id, ad esempio

var Book = Backbone.Model.extend({urlRoot: 'books' }); 
var book = new Book({id: 1}); 
book.fetch(); // will get /books/1 

var Book = Backbone.Model.extend({}); 
var book = new Book({url: 'books/1'}); 
book.fetch(); // will get /books/1 


var Books = Backbone.Collection.extend({model: Book}); 
var books = new Books({ /*....*/ }); 
books.fetch(); // will get /books/ 

È possibile fare riferimento al codice sorgente UrlRoot spina dorsale del modello here

Spero ha senso per te, buona fortuna.

Problemi correlati