如何获取包含集合和模型ID的URL

时间:2016-10-23 12:13:15

标签: javascript backbone.js

我创建了一个网站来创建一些地图。所以,我的所有地图都有一个id,我的地图上有一些带有ID的元素。

所以我创建了一个带有id的集合Map,它的模型是我的地图对象:

app.collections.mapDetailsCollection = Backbone.Collection.extend({
    model: app.models.mapDetailsModel,
    initialize: function(options) {
        this.id = options.id;
    },
    url: function () {
        return this.absURL + '/api/maps/' + this.id;
    },
    parse: function(response){
        return response.features;
    },
    toGeoJSON: function(){
        var features = [];
        this.models.forEach(function(model){
            var feature = model.toGeoJSON();
            if (! _.isEmpty(feature.geometry)) {
                features.push(feature);
            }
        });
        return {
            'type': 'FeatureCollection',
            'features': features
        };
    }
});

但我的模特也有一个id。我不知道模型如何返回带有集合ID的URL。

我需要返回/api/maps/id_collection/id_model

1 个答案:

答案 0 :(得分:2)

将模型添加到集合时,它会接收对集合的引用。因此,如果每个模型都在集合中,则会设置集合属性this.collection

来自Backbone model constructor文档(强调我的):

  

如果您传递{collection: ...}作为选项,则模型获得一个   collection属性,用于指示哪个集合   model属于,用于帮助计算模型的url。的的   model.collection属性通常在您自动创建   首先将模型添加到集合中。请注意,反之则不然,   将此选项传递给构造函数时不会自动添加   该集合的模型。有时候很有用。

然后,您可以使用它来构建模型的完整URL:

var app.models.mapDetailsModel = Backbone.Model.extend({
    urlRoot: function() {
        // Backbone adds the model id automatically
        return this.collection.url() + '/my-model/';
    }
    // ...snip...
});

请注意,模型的默认网址是您想要的。

  

默认情况下生成格式为[collection.url]/[id]的网址,但是   您可以通过指定模型的显式urlRoot来覆盖   收集不应该被考虑在内。