从没有观察者的服务中观察控制器属性(参与查询参数)

Observing controller property (participating in queryparam) from service without observer

我将状态属性从控制器移动到服务,queryParams 除外。现在我想让查询参数之一 属性 进行服务。
有什么办法可以不使用观察者来实现这一点吗?

我目前正在使用观察者来做。

controllers/application.js

import Ember from 'ember';
const {computed,observer} = Ember;
export default Ember.Controller.extend({
  myService:Ember.inject.service(),
  appName: 'Ember Twiddle',
  changedAppName:observer('appName',function(){
    this.get('myService').changeAppName(this.get('appName'));
  }),
  actions:{
    changeApp(){
      this.set('appName','NewEmberApp');
    }
  }
});

templates/application.hbs

<h1>Welcome to {{myService.appName}}</h1>
<br>
<button {{action "changeApp"}}>Change</button>
<br>
{{outlet}}
<br>
<br>

services/my-service.js

import Ember from 'ember';

export default Ember.Service.extend({
  appName:'SSS',
  changeAppName(param){
    this.set('appName',param);
  }
});

EmberTwiddle

为什么你需要观察者?只需在控制器的 changeApp 操作中直接设置服务的 appName:this.set('myService.appName','Kumkanillam'); 并完全删除观察者。

你的问题变成了……您的评论后有所不同。让我用以下 twiddle 澄清一下我是否正确理解了你的问题。在这种情况下;您正在控制器和组件上修改 appName;这是违反 DDAU 原则的例证。在这种情况下,您需要控制器内部的观察者,以便在组件级别收到有关 appName 更改的通知。

为了解决这个问题;您可以在控制器级别创建别名计算 属性 并将其传递给组件(或其他组件或路由模板),您将摆脱观察者。这 twiddle 解释了我的意思。

即使我理解的是正确的并且我提供的可能是有效的答案;不要忘记违反 DDAU 会在某些时候伤害你,你将不得不在未来重构你的代码。希望这有帮助。