Backbone JS模型和集合的URL

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

Book

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.model 中有两个选项:urlurlRoot。它们的目的和区别是什么?

Backbone.collection 中只有一个参数 url。这总是针对 RESTful API 的 GET 请求吗?

2个回答

36

基本上,构建模型的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);
}

一个位于集合中的backbone.model是否使用Backbone.Collection.url属性来确定保存、更新或删除的url? - Chris Muench
它在每个操作中都使用它。 - mirrormx
请查看此链接:https://dev59.com/lXTYa4cB1Zd3GeqPqRGO。您可以覆盖URL设置,例如:yourModel.save({ url: yourModel.urlRoot + yourModel.get("id") }); - oak
@mirrormx 嘿,在 url 函数中,最初它会检查模型的 urlroot,然后检查集合的 url,那么它在哪里检查模型的 url? - StateLess

12

在模型中

  1. urlRoot 用于 Model。
  2. url 用于 Model 实例。

因此,如果 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/ 

你可以在这里查看 Backbone Model 的 urlRoot 源代码。

希望对你有帮助,祝好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接