过渡到 Octane:替换 addObserver 设计

Transition to Octane: replace addObserver design

服务执行的服务请求当前触发组件使用 addObserver 模式侦听的“通知”,即 aService 只是切换其 _property,组件使用 aService.addObserver('_property'){action.. .}。请问如何在 Octane 中重新设计此模式?谢谢你。卡雷尔

对于这种情况,我发现使用 Ember.Evented 和 pub/sub 模式很有用。

这些组件使用依赖注入来接收服务的实例,并在它们的构造函数中(或在需要时的其他地方)订阅服务上的某个“主题”。考虑一个示例,其中 publisher 服务以一致的间隔生成报价。在我们的组件中,我们想要订阅 updateTick 主题并在每次触发事件时增加我们当前的 tick 值。

import Component from '@glimmer/component';
import { inject } from '@ember/service';
import { tracked } from '@glimmer/tracking';

export default class extends Component {
  @inject
  publisher;
  
  @tracked
  tick = 0;
  
  constructor(){
    super(...arguments);
    this.publisher.on('updateTick', () => {
      this.tick = this.tick + 1;
    });    
  }
}

当该主题有更新值时,该服务会触发一个所有订阅者都可以看到的事件。在这里,我每秒触发一个 updateTick 事件。

import Service from '@ember/service';
import Evented from '@ember/object/evented';

export default class Publisher extends Service.extend(Evented){
  constructor(){
    super(...arguments);
    setInterval(() => { 
      this.trigger("updateTick");
    }, 1000);
  }
}

这是example Ember Twiddle