backbone.js中模型之间的关系



我正在寻找正确的骨干结构,以实现以下目标:

两个服务器api:

  • GET api/event/4:返回id为4的事件对象
  • GET api/event/4/registrations:返回id为4的事件的注册对象列表

我想要一个显示事件对象和注册列表的视图。

这是非常直接的,但我不知道如何组织我的事件和注册模型。我应该使用主干关系吗?

我的事件模型目前是这样的:(该集合预计包含从现在开始的下一个10个事件)。

我应该如何定义我的注册模型,我将如何初始化它,知道它总是在一个事件模型的上下文中?

var app = app || {};
app.EventModel = Backbone.Model.extend({
    urlRoot: app.API_server + 'event'
});

app.EventCollection = Backbone.Collection.extend({
    model: app.EventModel,
    url: app.API_server + 'event',
    initialize: function(){
        dt = new Date();
        start_dt = dt.toISOString();
        this.fetch({
            data: {limit:10, start_dt:start_dt},
            error: function (model, response, options) {
                if(response.status == '403') {
                    app.Session.logout();
                }
            }
        })
    }
});

为注册创建一个集合,并使用url属性作为函数。默认情况下,RegistrationCollection模型的urlRoot将是附加了id的集合的url

app.RegistrationCollection = Backbone.Collection.extend({
    url: function() {
        return app.API_server + 'event/' + this.id + '/registrations';
    },
    initialize: function(models, options) {
        options = options || {};
        this.id = options.id;
    }
});

然后,在EventModel初始化时,添加一个RegistrationCollection作为属性,将事件id作为一个选项传递给集合。

app.EventModel = Backbone.Model.extend({
    urlRoot: app.API_server + 'event',
    initialize: function() {
        this.registrations = new app.RegistrationCollection(null, {
            id: this.id
        });
    }
});

从init中删除fetch,你想让你的集合可重用。

app.EventCollection = Backbone.Collection.extend({
    model: app.EventModel,
    url: app.API_server + 'event',
});

在视图或路由器中获取,这取决于在哪里对你的应用更有意义。

var EventView = Backbone.View.extend({
    initialize: function() {
        this.collection = new app.EventCollection();
        var dt = new Date(),
            start_dt = dt.toISOString();
        // this should be here, outside of the collection.
        this.collection.fetch({
            data: { limit: 10, start_dt: start_dt },
            error: function(model, response, options) {
                if (response.status === 403) {
                    app.Session.logout();
                }
            }
        });
    },
});

相关内容

  • 没有找到相关文章

最新更新