Я использую службу шины событий в своем приложении, как показано ниже;
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);
}
})
Теперь я использую это из своего приложения, как показано ниже. У меня есть Event-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, реальный код меня немного смущает.
В частности, в моем Event-Mixin есть код вроде
this.get('events').on(eventName, this, callback);
Однако, если я посмотрю на свой шина событий, которая похожа на обычную ч / б службу, которую я использую, имеет
subscribe: function(){
this.on.apply(this, arguments);
}
Я запуталась, потому что из моего приложения не было вызова напрямую к publish/subscribe/unsubscribe
методам, определенным в event- шина (вместо этого у меня this.get('events').on(....)
)
Как это работает?