根据我的理解,Backbone JS模型的默认行为是返回集合的URL,,除非模型指定了urlRoot
。我似乎无法让这种行为发挥作用。
来自文件:
model.url()…默认情况下生成形式为"[collection.url]/[id]"的url,但如果不应考虑模型的集合,则可以通过指定显式urlRoot来覆盖。
这是我的收藏,和模型分别是:
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/
。
如果我正确理解了文档,那么模型的urlRoot
应该覆盖这种行为;并且即使在那时模型url也应该是CCD_ 5。
有什么我遗漏/误解的想法吗?
PS:集合中的model: Model
是通过RequireJS 引入的
即使指定了urlRoot
,它也将始终使用集合的url。
urlRoot
的原因是,您可以在重写中使用它,或者如果模型恰好不在集合中(例如,它可能被删除,但仍然存在于客户端上)。
因此,如果要fetch
或save
模型并覆盖集合生成的url,则需要将urlRoot
作为选项显式传递到这些方法中。例如:
yourModel.save({ url: yourModel.urlRoot });
我同意文档令人困惑,这也让我最近陷入了困境。
UrlRoot应该是一个函数,并且模型必须定义attributeId
。若您像这样定义您的模型,那个么无论模型是否在集合中,所有操作都将起作用。
Backbone在urlRoot
函数返回的URL末尾添加modelId
。
var MyModel = Backbone.Model.extend({
attributeId: 'myModelId'
urlRoot: function() {
return '/theurl';
},
initialize: function() {
}
defaults: {
myModelId: null
}
});
在模型中,尝试使用:
url: function() {
return 'your url goes here';
}