EmberJs是否支持发布/订阅者事件模式?

zha*_*_ca 10 ember.js

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

person.addObserver('fullName', function() {
  // deal with the change
});
Run Code Online (Sandbox Code Playgroud)

但我更喜欢Backbone.Events,你可以订阅或发布一个事件,具体来说:

var object = {};

_.extend(object, Backbone.Events);

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

object.trigger("alert", "an event");
Run Code Online (Sandbox Code Playgroud)

任何人都知道EmberJS是否可以做到这一点?

为了给你一些关于我的问题的背景知识,我们的应用程序是一个实时应用程序.因此,后端RESTful服务有时会向客户端(JavaScript端)发起一个事件.我想有一个数据层,它封装了对后端RESTful服务的访问,但也保留了一个缓存.我希望EmberJS.Data可以帮助我(这是一个单独的问题,我想找到答案).有了这个,我还想在后端RESTful服务发生更改时更新缓存.更新缓存对象后,我希望通知Controller层.这基本上就是为什么我需要JavaScript端的一些事件机制.

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

谢谢

pan*_*atz 11

自提交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
});?
Run Code Online (Sandbox Code Playgroud)


tom*_*yjr 8

如果你想要一个通用的发布/订阅中心,你可以利用一点点语法糖来利用Evented(就像pangratz所说)的触发/开启.这就是我在做的事情:

App.Hub = Ember.Object.create({
  init: function(){
    this.set('HUB', Ember.Object.createWithMixins(Ember.Evented, {}));
  },

  publish: function(){
    var hub = this.get('HUB');
    return hub.trigger.apply(hub, arguments);
  },

  subscribe: function(){
    var hub = this.get('HUB');
    return hub.on.apply(hub, arguments);
  }
});

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

App.Hub.subscribe('test-started', function(name){ 
  console.log("Test " + name + " started");
});

...

App.Hub.publish('test-started', 'Biology I');
App.Hub.publish('test-started', 'Calculus');