Использование Ember Evented в сервисе для публикации / подписки на события - PullRequest
0 голосов
/ 22 марта 2020

Я использую службу шины событий в своем приложении, как показано ниже;

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(....))

Как это работает?

1 Ответ

1 голос
/ 23 марта 2020

Фактический шаблон Ember.evented использует on , off и trigger в качестве основного API. Ваша служба обработки событий, кажется, является оболочкой для этих функций, что соответствует Ember.Evented более универсальному шаблону c pub / sub.

Следующий код

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

эффективно скомпоновал trigger -> publish и on -> subscribe. Почему эти псевдонимы не используются в вашей кодовой базе, никто, кроме ваших товарищей по команде, не может ответить (или, возможно, поиск в истории контроля версий). Из кода, который вы показали, компоненты вашего приложения используют event-bus в качестве источника события, но напрямую используют API Ember.Evented.

...