BackboneJS模型URL使用集合URL

9
根据我的理解,Backbone JS Models 的默认行为是返回Collection的URL,除非指定了model的urlRoot。但我好像无法使此行为生效。
根据文档:

model.url() ... 默认情况下生成类似"[collection.url]/[id]"的URL,但如果不考虑模型的集合,则可以通过指定显式的urlRoot来覆盖它。

以下是我的Collection和Model:
var MyCollection = Backbone.Collection.extend({
    model: Model,
    initialize: function(options){
        this.options = options || {};
    },
    url: function(){
        return "/theurl/" + this.options.param;
    }
});
return MyCollection;

...

var MyModel = Backbone.Model.extend({
    urlRoot: '/theurl',
    initialize: function() {
    }
});
return MyModel;

如果没有集合加载模型,它可以很好地提交到/theurl,但是当它被加载到集合中时,所有方法都会提交到/theurl/param/

如果我正确理解文档,那么Model的urlRoot应该覆盖这种行为;即使如此,模型的URL也应该是/theurl/param/{MODEL-ID}

你对我忽略/误解了什么有什么想法吗?

...

附注:来自集合的model: Model通过RequireJS引入。

3个回答

9

即使您指定了urlRoot,它仍将始终使用集合的URL。

urlRoot的原因是让您可以在覆盖中使用它,或者如果模型恰好不在集合中(例如,可能被删除,但仍存在于客户端中)。

因此,如果您想要fetchsave模型并覆盖集合生成的URL,则需要将urlRoot作为选项显式地传递给这些方法。例如:

yourModel.save({ url: yourModel.urlRoot });

我同意,文档确实有点让人困惑。最近我也被这个问题搞糊涂了。


谢谢你的回答。文档在这方面似乎非常模糊。你有什么想法为什么它没有将模型ID添加到集合URL的结尾? - caleb
有几件事情。您刚在客户端创建了模型吗?如果是这样,它可能没有ID,因为它尚未保存到服务器上。在这种情况下,它只有一个cId。 - dcarson
2
我认为应该这样写:yourModel.save({}, { url: yourModel.urlRoot });。目前的写法会将对象上的 url 属性设置为第一个参数是属性哈希表,而不是 URL。 - flyingL123
你的Model.save({}, { url: yourModel.urlRoot }); 成功了! - Srikanth Jeeva

1
UrlRoot 应该是一个函数,模型必须定义 attributeId。如果您像这样定义模型,则所有操作都将在集合中或不在集合中工作。
Backbone 在由 urlRoot 函数返回的 URL 结尾处添加 modelId。
var MyModel = Backbone.Model.extend({
    attributeId: 'myModelId'
    urlRoot: function() {
        return '/theurl';
    },
    initialize: function() {
    }
    defaults: {
        myModelId: null
    }
});

我刚刚进行了测试,将urlRoot设置为函数而不是字符串,并且当模型位于集合中并且在模型上调用save时,它没有使用模型的urlRoot函数。 - dcarson
如果模型在集合中,则使用集合URL。当模型不在集合中时,才使用urlRoot。 - maketest
没错!这种行为正是提问者所询问的,因为对他/她来说是意外的。文档很令人困惑,它暗示设置 urlRoot 将意味着模型始终使用 urlRoot,即使它在集合中。就像我在我的回答中所说的,正如你在评论中所说的那样,实际情况并非如此。 - dcarson

0
在模型中,请尝试使用:
url: function() {
    return 'your url goes here';
}

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