【问题标题】:Backbone JS Models and Collection URLsBackbone JS 模型和集合 URL
【发布时间】:2013-05-31 16:38:15
【问题描述】:

如果我有一个名为“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.model 中有两个选项:urlurlRoot。这些的目的和区别是什么?

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

【问题讨论】:

    标签: backbone.js


    【解决方案1】:

    基本上,构建模型的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) 方法。

    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);
    }
    

    【讨论】:

    • 集合内的主干模型是否使用 Backbone.Collection.url 属性来确定要保存、更新或删除的 url?
    • 每次操作都会用到它。
    • 查看this。您可以覆盖 url 设置,即 yourModel.save({ url: yourModel.urlRoot + yourModel.get("id") });
    • @mirrormx hey in the url function 最初它正在检查模型的 urlroort 然后是集合的 url 它在哪里检查模型的 url?
    【解决方案2】:

    在模型中

    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源码here

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多