0

所以,我刚刚开始使用backbone.js,我在理解如何定义两个集合时遇到了一些麻烦,其中一个集合在另一个集合的模型中。

REST API 看起来像这样:

/sites <--- one collection
/sites/123/entities <--- another collection
/sites/123/entities/abc <--- a specific entity within a specific site

这是 Sites 集合的定义方式:

var ROOT = 'http://localhost:5000';

Site = Backbone.Model.extend({
    defaults: {
        id: "default",
        description: "My site"
    }
});

Sites = Backbone.Collection.extend({
    model: Site,
    url: ROOT + "/sites"
});

实体集合和模型将如何实现这一目标?

4

1 回答 1

1

这就是我想象的样子,虽然还没有测试过:实体模型/集合:

var ROOT = 'http://localhost:5000';
Entity = Backbone.Model.extend({
    defaults: {
        id: "default",
        description: "My Entity"
    }
});
Entities = Backbone.Collection.extend({
    model: Entity,
    ownUrl: '/entities',
    site: {},
    url: function() {
        return (this.site? this.site.url() : '') + this.ownUrl;
    },
    initialize: function(options) {
        this.site = options.site;
    }
});

场地模型/收藏:

Site = Backbone.Model.extend({
    defaults: {
        id: "default",
        description: "My site"
    }
});

Sites = Backbone.Collection.extend({
    model: Site,
    url: ROOT + "/sites",
});

设置示例:

// New collection of site
var site1 = new Site({id: 'site1', description: "This is site 1"});
var site2 = new Site({id: 'site2', description: "This is site 2"});
// Add entities to sites
var entityCollection1 = new Entities([
    {id: 'entity1'},
    {id: 'entity2'}
], {site: site1});
// Collection of sites 
var mySites = new Sites([site1,site2]);

编辑:

  • 根据 Backbone 文档,从 1.1 版开始, this.options 不再自动附加。对不起,我仍然参考 0.9.x 代码。

在 1.1 中,Backbone 视图不再将 options 参数作为 this.options 自动附加。如果您愿意,请随时继续附加它。http://backbonejs.org/#changelog

  • 对于 url,我的错,它应该是 this.site.url() 因为它是一个模型的函数,它将采用默认值作为[collection.url/modelId]

在这种情况下,它应该为模型 site1返回'site/1' (即'site/2'),然后附加您的实体集合 url 将是什么。(例如:'/entities')。这使站点 1 的实体集合 url 变为:/site/1/entities。此集合中的任何模型都将具有 url /site/1/entities/[modelId]

于 2013-11-08T15:23:47.267 回答