如何使用 Ember.sendEvent 将事件发送到每个实例化的控制器

How do I use Ember.sendEvent to send an event to every instantiated controller

本文关键字:实例化 控制器 Ember 何使用 sendEvent 事件      更新时间:2023-09-26

我的应用程序路由中有一个操作,导致发生全局更改。 此全局更改涉及一些异步处理(承诺),当解决时,需要我向实例化的控制器发送事件。侦听事件的控制器需要刷新一些视图。

更具体地说,我正在下载一些字体,任何具有画布视图的控制器都需要重新绘制。

我知道哪些控制器有画布。 如果控制器尚不存在,则使用 controllerFor 将实例化控制器,这很糟糕。同样,__container__.lookup也会这样做。

如果这个设计是废话,请告诉我。 但除此之外,如何获取实例化的控制器?

此外,字体无法预加载,因为它们很大(每个 5MB)。 相反,我们使用的是发送仅包含我们请求的字符的字体的服务。如果用户键入其他字符,我们必须请求新字体。

从应用程序路由中,此代码用于获取所有实例化的控制器。 但是感觉很脏,所以我坚持一个更好的答案。

controllers: function() {
  var conatiner, regex;
  container = this.get("container");
  regex = /^controller:/;
  return Ember.keys(container.cache.dict).filter(function(key) {
    return key.match(regex);
  }).map(function(key) {
    return container.lookup(key);
  });
}.property().volatile().readOnly(),
triggerEvent: function() {
  this.get("controllers").forEach(function(controller) {
    Ember.sendEvent(controller, "didLoadFont");
  });
}