【问题标题】:Does EmberJs support publish/subscriber eventing pattern?EmberJs 是否支持发布/订阅者事件模式?
【发布时间】:2012-03-16 21:32:12
【问题描述】:

我最近正在评估一个用于我们下一个项目的 JavaScript 框架。我真的很喜欢Ember。但是在我们的应用程序中,我们需要数据层的事件机制来通知控制器层发生了一些变化。我知道可以在 Ember 中使用 obersevers,例如:

person.addObserver('fullName', function() {
  // deal with the change
});

但我更喜欢 Backbone.Events 中的更多内容,您可以订阅或发布事件,具体来说:

var object = {};

_.extend(object, Backbone.Events);

object.on("alert", function(msg) {
  alert("Triggered " + msg);
});

object.trigger("alert", "an event");

有人知道这在 EmberJS 中是否可行?

也为您提供一些关于我的问题的背景信息,我们的应用程序是一个实时应用程序。所以有时,后端 RESTful 服务会向客户端(JavaScript 端)触发一个事件。我想要一个数据层来封装对后端 RESTful 服务的访问,但也保留一个缓存。我希望 EmberJS.Data 可以帮助我(这是我想找到答案的另一个问题)。有了这个,我还希望在后端 RESTful 服务发生更改时更新缓存。更新缓存对象后,我希望通知控制器层。这基本上就是为什么我需要在 JavaScript 端使用一些事件机制。

请注意,我不想使用 Observers 的原因是有时,一个事件可能意味着我必须执行一个操作,即加载一条消息,或指示语音呼叫即将到来。骨干方式对我来说似乎更自然。

谢谢

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    自从提交 2326580 - 自 v0.9.6 以来可用 - 有一个 Ember.Evented Mixin,请参阅 http://jsfiddle.net/qJqzm/

    var handler = Ember.Object.create({
        otherEvent: function() {
            console.log(arguments);
        }
    });
    
    var myObject = Ember.Object.create(Ember.Evented, {
        init: function() {
            this._super();
            this.on('alert', this, 'alert');
        },
        alert: function() {
            console.log(arguments);
        }
    });
    myObject.on('otherEvent', handler, 'otherEvent');
    
    myObject.fire('alert', {
        eventObject: true
    });
    myObject.fire('otherEvent', {
        first: true
    }, {
        second: true
    });​
    

    【讨论】:

      【解决方案2】:

      如果您想要一个通用的发布/订阅中心,您可以利用 Evented(如 pangratz 所说)中的 trigger/on 和一点语法糖。这就是我正在做的事情:

      App.Hub = Ember.Object.create({
        初始化:函数(){
          this.set('HUB', Ember.Object.createWithMixins(Ember.Evented, {}));
        },
      
        发布:函数(){
          var hub = this.get('HUB');
          返回 hub.trigger.apply(集线器,参数);
        },
      
        订阅:函数(){
          var hub = this.get('HUB');
          返回 hub.on.apply(集线器,参数);
        }
      });
      

      然后,在您的应用程序中使用它:

      App.Hub.subscribe('test-started', function(name){
        console.log("测试" + 名称 + "开始");
      });
      
      ...
      
      App.Hub.publish('测试开始', '生物学 I');
      App.Hub.publish('test-started', 'Calculus');
      

      【讨论】:

      • 如何使用您的解决方案取消订阅活动?
      • @Parzifal,添加一个类似于“subscribe”的方法“unsubscribe”,它调用emberjs.com/api/classes/Ember.Evented.html#method_off 而不是“on”。然后你可以像App.Hub.unsubscribe('test-started')一样使用它。
      猜你喜欢
      • 1970-01-01
      • 2016-12-14
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 2019-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多