9

据我了解,Backbone JS 模型的默认行为是返回集合的 URL,除非模型有urlRoot指定。我似乎无法让这种行为发挥作用。

从文档中:

model.url() ... 默认生成以下形式的 URL:“[collection.url]/[id]”,但如果不考虑模型的集合,您可以通过指定显式 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 也应该是/theurl/param/{MODEL-ID}.

关于我遗漏/误解的任何想法?

...

PS:model: Model集合中的通过RequireJS引入

4

3 回答 3

9

即使您已urlRoot指定,它也将始终使用集合的 url。

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

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

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

我同意文档令人困惑,这也让我最近也感到困惑。

于 2013-07-04T04:16:03.853 回答
1

UrlRoot 应该是一个函数,并且模型必须已经attributeId定义。如果您像这样定义模型,则无论模型是否在集合中,所有操作都将正常工作。

modelId在函数返回的 URL 末尾添加骨干网urlRoot

var MyModel = Backbone.Model.extend({
    attributeId: 'myModelId'
    urlRoot: function() {
        return '/theurl';
    },
    initialize: function() {
    }
    defaults: {
        myModelId: null
    }
});
于 2013-07-04T07:43:53.530 回答
0

在模型中,尝试使用:

url: function() {
    return 'your url goes here';
}
于 2015-12-10T01:17:22.547 回答