Backbone.js - 一个视图的多个模型

时间:2016-07-06 11:12:46

标签: javascript backbone.js

我有一个模板需要从两个不同的API端点(URL)接收数据:java -jar ...cart

我希望这两个端点充当一个模型或集合,以便我可以执行user.changedAttributes()sync之类的操作。

我知道Backbone非常宽容,但我真的很失落。

游乐场:

我创建了一个codepen,看看到目前为止我做了什么:http://codepen.io/anything/pen/AXoBoa

期望的结果应该是这样的:

fetch

2 个答案:

答案 0 :(得分:3)

您可以创建一个事件集中器来监听其注册的对象,并重新触发您捕获的事件。

这样的东西
var aggregate = _.extend({}, Backbone.Events);
aggregate.register = function(m) {
    var self = this;

    this.listenTo(m, 'all', function() {
        this.trigger.apply(this, arguments);
    });
};

然后你会像这样使用它

aggregate.on('change', function(m) {
    // do what you have to do when one of the models change
    console.log('Change on ', m.toJSON());
});
aggregate.on('sync', function(m) {
    //same thing for syncs
    console.log('sync ', m.toJSON());
});

var m1 = new Backbone.Model({id: 1});
var m2 = new Backbone.Model({id: 2});
aggregate.register(m1);
aggregate.register(m2);

m1.fetch();
m2.set({data: 2});

演示http://jsfiddle.net/nikoshr/hm0xc79z/

答案 1 :(得分:1)

基于http://backbonejs.org/#Events的nikoshr略有不同的方法。基本思想是您设置一个可在两个视图中引用的事件对象。您可以根据需要为事件命名,并且可以触发和侦听对象可用的任何位置。

  1. 创建事件对象。在您的情况下,将其添加到您的主apphell对象。

    appShell.Events = _.extend({}, Backbone.Events);
    
  2. 当用户在注销等用户视图中执行操作时,触发事件。

    appShell.Events.trigger('user:logout');
    
  3. 在另一个视图中收听事件并根据它执行操作。

    this.listenTo(appShell.Events, 'user:logout', this.doSomething);
    
  4. 在doSomething中放置逻辑,以便在另一个视图上执行您需要做的任何事情。