26

如果我有一个名为“Book”的模型和一个名为“Library”的集合,定义如下:

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

图书馆

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

当我打电话时BookInstance.save(),它是如何提出要使用的 URL 的?它是从收藏中获得的吗?

Backbone.model2 个选项:urlurlRoot。这些的目的和区别是什么?

Backbone.collection中,只有一个参数url。这总是 RESTFUL api 的 GET 请求吗?

4

2 回答 2

36

基本上,有 3 种可能性来构建模型的 url:

  • 如果模型对象存在于集合中,那么它的url方法将返回一个由collection.urlmodel.id:组成的地址[collection.url]/[id]

  • 如果您不想在集合内使用模型,则model.urlRoot可以使用 ' 值代替collection.url片段,从而产生以下模式:[urlRoot]/[id].

  • 最后,如果您不打算将多个给定类型的模型保存到服务器,或者将在创建每个模型时为其定义 URL,您可以直接为model.url.

集合只发送 GET 请求——获取模型的 JSON 数据数组。对于保存、删除和更新,使用单个模型的save()(POST/PUT/PATCH) 和destroy()(DELETE) 方法。

这是 的源代码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);
}
于 2013-05-31T16:54:12.500 回答
12

在模型中

  1. urlRoot用于模型。
  2. url用于模型的实例。

因此,如果urlRoot存在,则 book.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 源代码

我希望它对你有意义,祝你好运。

于 2015-02-22T11:49:53.027 回答