Backbone JS模型和集合URL

Chr*_*nch 26 backbone.js

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

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

图书馆

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

当我打电话BookInstance.save()告诉它如何使用URL?它是从集合中派生出来的吗?

Backbone.model有2种选择:urlurlRoot.这些之间的目的和区别是什么?

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

mir*_*rmx 35

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

  • 如果集合中存在的模型对象,然后它的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);
}
Run Code Online (Sandbox Code Playgroud)


Ala*_*ong 12

在模型中

  1. urlRoot用于模型.
  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/ 
Run Code Online (Sandbox Code Playgroud)

您可以在此处参考骨干模型urlRoot源代码

我希望你有意义,祝你好运.