我最近评估了一个用于下一个项目的JavaScript框架。我真的很喜欢Ember。但是在我们的应用程序中,我们需要一个来自数据层的事件机制来通知控制器层某些内容已经发生了变化。我知道可以在Ember使用观察者,例如:
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服务发生更改时更新缓存。更新缓存对象后,我希望通知Controller层。这就是我在JavaScript方面需要一些事件机制的基本原因。
请注意,我不想使用观察者的原因是,有时候,事件可能意味着我必须执行操作,即加载消息或指示语音呼叫即将到来。骨干方式对我来说似乎更加自然。
由于
答案 0 :(得分: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
});
答案 1 :(得分: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');