ember.js 在用于发布/订阅事件的服务中使用Ember事件

lmyy7pcs  于 2022-11-05  发布在  其他
关注(0)|答案(1)|浏览(130)

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

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(....)
它是如何工作的?

9jyewag0

9jyewag01#

实际的Ember.evented模式使用onofftrigger作为主API。您的事件总线服务似乎是这些函数的 Package 器,使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.Evented API。

相关问题