需要 Backbonejs Model.url?

Backbonejs Model.url required?

我有一个示例设置来说明我的问题:http://jsfiddle.net/5xo4yzw2/1/

var root = "http://jsonplaceholder.typicode.com"

var Post = Backbone.Model.extend({
    url: function(){
        return this.get('url') || root + "/posts/" + this.get('id')
    }
});

var Posts = Backbone.Collection.extend({
    model: Post,
    url: root + "/posts"
});


var posts = new Posts();
posts.fetch();
console.log("Call to collection fetch works")

var post = new Post({id: 1});
post.fetch();
console.log("Call to collection fetch works")

这个例子有效,也就是说,console.logs 都被执行了,.fetch() 没有引发异常。然而,根据 http://backbonejs.org/#Model-url 和我正在阅读的书,我的理解是,一旦我将 "/posts" 指定为集合 url,模型 url 应该会自动解析[collection.url]/[id],尽管事实并非如此。如果我没有在模型中提供 url 函数,则在获取时会引发异常,说明必须提供第 url 参数。

我是不是误会了什么?

您尚未将 post 模型添加到 collection,以便模型使用 collections URL 它必须是 collection 的一部分。

例如

var post = new Post({id: 1});
posts.add(post);
post.fetch();
console.log("Call to collection fetch works")

Updated Fiddle

作为@Artem Baranovskii pointed out, If you want to use a model outside a collection you should be using the urlRoot property. From the documentation

Specify a urlRoot if you're using a model outside of a collection, to enable the default url function to generate URLs based on the model id. "[urlRoot]/id" Normally, you won't need to define this. Note that urlRoot may also be a function.

如果您使用的是系列之外的模型,您可以像下面这样使用 urlRoot

var root = "http://jsonplaceholder.typicode.com"

var Posts = Backbone.Model.extend({
    urlRoot: function () {
       return this.get('url') || (root + "/posts/" + this.get('id'))
   }
});

var posts = new Posts();
posts.fetch();

console.log("Call to collection fetch works")

当您执行 fetch 时,模型会尝试通过几种方法 here

获得 url