我在我的应用程序中使用了一个事件总线服务,如下所示;
import Evented from '@ember/object/evented';
import Service from '@ember/service';
export default Service.extend(Evented, {
publish: function(){
return this.trigger.apply(this, arguments);
},
subscribe: function(){
this.on.apply(this, arguments);
},
unsubscribe: function(){
this.off.apply(this, arguments);
}
})
现在我从我的应用程序中使用它,如下所示。我有一个类似于 Package 器的事件混合器,如下所示;
export default Mixin.create({
events: service('event-bus'),
subscribe: function(eventName, callback){
this.get('events').on(eventName, this, callback);
},
unsubscribe: function(eventName, callback){
this.get('events').off(eventName, this, callback);
}
})
此外,要在组件中实际使用它,我有;
import events from '../mixins/event-mixin';
export default Component.extend (events, {
eventsToListen: function(){
return [{
eventName: "enableBtn",
callBack: $..proxy(this.enableBtn, this);
}]
}
}
我在这里展示了相关代码的一小部分。虽然我理解了观察者模式,但实际的代码让我有点困惑。
具体来说,在我的事件混合中,我有如下代码
this.get('events').on(eventName, this, callback);
然而,如果我查看我的事件总线,它就像我使用的一个常见f/w服务,它
subscribe: function(){
this.on.apply(this, arguments);
}
我感到困惑的是,我的应用程序没有直接调用事件总线中定义的publish/subscribe/unsubscribe
方法(相反,我有this.get('events').on(....)
)
它是如何工作的?
1条答案
按热度按时间9jyewag01#
实际的
Ember.evented
模式使用on、off和trigger作为主API。您的事件总线服务似乎是这些函数的 Package 器,使Ember.Evented
符合更通用的pub/sub模式。下面的代码
已经有效地使用了
trigger
-〉publish
和on
-〉subscribe
的别名。为什么这些别名函数没有在您的代码库中使用,除了您的团队成员之外,没有人能够回答这个问题(或者通过版本控制历史记录进行搜索)从您显示的代码中可以看出,应用中的组件使用event-bus
作为事件源,而是直接使用Ember.Evented
API。