代码之家  ›  专栏  ›  技术社区  ›  Quentin Gillet Emile Bergeron

backbone.js中模型之间的关系

  •  1
  • Quentin Gillet Emile Bergeron  · 技术社区  · 8 年前

    两个服务器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();
                    }
                }
            })
        }
    });
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   Quentin Gillet Emile Bergeron    8 年前

    为注册创建集合,并使用 url 属性作为函数。默认情况下 urlRoot 的模型 RegistrationCollection 将是 网址 与他们的收藏 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 初始化,添加 登记收集 作为属性,传递事件 作为集合的选项。

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

    删除 fetch 从init开始,您希望使集合可重用。

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