javascript - backbone.js 中模型之间的关系

标签 javascript backbone.js backbone-model backbone-relational

我正在寻找正确的 Backbone 结构来实现以下目标:

两个服务器 API:

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

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

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

我的事件模型目前是这样的: (该集合预计将包含从现在开始的接下来的 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属性作为函数。默认情况下,urlRoot RegistrationCollection 的型号将是 url与他们的收藏 id附上。

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
        });
    }
});

删除 fetch从一开始,您就想让您的收藏可重用。

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

在 View 或路由器内部获取,具体取决于它对您的应用程序更有意义的位置。

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();
                }
            }
        });
    },
});

关于javascript - backbone.js 中模型之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40585889/

相关文章:

javascript - 主干仅验证保存中的单个属性

javascript - 如何在 Typescript 中序列化/反序列化复杂对象,例如反序列化对象与序列化对象的类型相同

javascript - 计时器自动运行,而不是在按钮单击 JavaScript 时运行

javascript - 带有 BackboneJS 的 Jplayer 不加载闪存备份

javascript - 保存模型时如何强制执行 POST 请求?

javascript - 定期监听backbone.js中的变化

javascript - 在 Chartkick.js 中添加价格标签

javascript - 将标志从 PHP 发送到 JavaScript

javascript - 除了数据绑定(bind)之外,backbone.js(或 knockout.js)还提供哪些优势

javascript - 为什么在实现事件时不使用 IIFE 来保护隐私?