我在我的应用程序中使用事件总线服务,如下所示;
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);
}
})现在我从我的应用程序中使用它,如下所示。我有一个事件混合,它有点像一个包装器,如下所示;
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);
}]
}
}我在这里展示了相关代码的几个部分。虽然我理解观察者模式,但实际的代码让我有点困惑。
具体地说,在我的event-mixin中,我有如下代码
this.get('events').on(eventName, this, callback);然而,如果我看一下我的event-bus,它就像我使用的一个普通的f/w服务,它有
subscribe: function(){
this.on.apply(this, arguments);
}我很困惑,因为我的应用程序没有直接调用event-bus中定义的publish/subscribe/unsubscribe方法(相反,我有this.get('events').on(....))
它是如何工作的?
发布于 2020-03-23 18:16:02
实际的Ember.evented模式使用on、off和trigger作为主API。您的事件总线服务似乎是这些函数的包装器,使Ember.Evented符合更通用的发布/订阅模式。
下面的代码
publish: function(){
return this.trigger.apply(this, arguments);
},
subscribe: function(){
this.on.apply(this, arguments);
}实际上是trigger -> publish和on -> subscribe的别名。为什么你的代码库中没有使用这些别名函数,这是除了你的队友之外没有人能回答的问题(或者可能是通过搜索版本控制历史)。从您所显示的代码中可以看出,应用程序中的组件使用event-bus作为事件源,但直接使用Ember.Evented API。
https://stackoverflow.com/questions/60799589
复制相似问题