2013-05-31 100 views
26

如果我有一個名爲「圖書」的模式,並命名爲「庫」,如下定義的集合:骨幹JS模型和收藏的URL

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

圖書館

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

當我叫BookInstance.save()它是如何拿出來使用的網址是什麼?它是從集合中派生出來的嗎?

Backbone.model有2個選項:urlurlRoot。這些的目的和區別是什麼?

Backbone.collection,有一個單一的參數url。這是否始終是RESTFUL api的GET請求?

回答

35

基本上有3種可能性,構建一個模型的網址:

  • 如果集合中存在的模型對象則其url方法將返回collection.urlmodel.id組成的地址:[collection.url]/[id]

  • 如果你不想使用集合內的模型,然後model.urlRoot的值可以用來代替collection.url片段,得到了以下的模式:[urlRoot]/[id]。最後,如果您不打算將更多的給定類型的一個模型持久保存到服務器,或者將在創建時爲每個模型定義URL,則可以直接將值分配給model.url

集合只能發送GET請求 - 讓模型的JSON數據的數組。爲了節省,刪除和更新,個別型號的save()(POST/PUT/PATCH)和destroy()(刪除)使用方法。

Here's the source code of Backbone.Model.url,這應該有助於您:

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

集合中的backbone.model是否使用Backbone.Collection.url屬性來確定要保存,更新或刪除的URL? –

+0

它用於每個操作。 – mirrormx

+0

查看[this](http://stackoverflow.com/questions/17461264/backbonejs-model-url-using-collection-url)。你可以覆蓋url設置,例如yourModel.save({url:yourModel.urlRoot + yourModel.get(「id」)}); – oak

12

在模型

  1. urlRoot用於模型。
  2. 網址用於模型的實例。

所以,如果urlRoot存在 然後書。fetch()方法將獲取給定ID數據,例如

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/ 

您可以參考骨幹示範urlRoot源代碼here

我希望這是有道理的你,祝你好運。