在发布/订阅事件的服务中使用Ember事件



我正在我的应用程序中使用事件总线服务,如下所示;

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);
}
})

现在我从我的应用程序中消费这个,如下所示。我有一个事件mixin,它有点像下面的包装器;

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);
}]
}
}

我在这里展示了相关代码的几个部分。虽然我理解Observer模式,但实际的代码让我有点困惑。

具体来说,在我的事件混合中,我有类似的代码

this.get('events').on(eventName, this, callback);

然而,如果我看看我的事件总线,它就像我使用的一个常见的f/w服务,它有

subscribe: function(){
this.on.apply(this, arguments);
}

我很困惑,因为我的应用程序没有直接调用事件总线中定义的publish/subscribe/unsubscribe方法(相反,我有this.get('events').on(....)(

它是如何工作的?

实际的Ember.evented模式使用on、off和触发器作为主要的API。您的事件总线服务似乎是这些函数的包装器,使Ember.Evented符合更通用的pub/sub模式。

以下代码

publish: function(){
return this.trigger.apply(this, arguments);
},
subscribe: function(){
this.on.apply(this, arguments);
}

有效地混叠了trigger->publishon->subscribe。为什么这些别名函数没有在你的代码库中使用,除了你的队友之外,没有人能回答(或者可能是在版本控制历史中搜索(。根据您显示的代码,应用程序中的组件使用event-bus作为事件源,但直接使用Ember.EventedAPI。

最新更新