BackboneJS model.url使用collection.url

时间:2013-07-04 03:09:47

标签: backbone.js backbone.js-collections

根据我的理解,Backbone JS Models的默认行为是返回Collection的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应该覆盖此行为;即便如此,模型网址应为/theurl/param/{MODEL-ID}

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

...

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

引入

3 个答案:

答案 0 :(得分:9)

即使您指定了urlRoot,也会始终使用该集合的网址。

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

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

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

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

答案 1 :(得分:1)

UrlRoot应该是一个函数,模型必须定义attributeId。 如果您像这样定义模型,如果模型处于收集状态,则所有操作都将起作用。

Backbone在modelId函数返回的网址末尾添加urlRoot

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

答案 2 :(得分:0)

In the model, try using:

url: function() {
    return 'your url goes here';
}