从没有观察者的服务中观察控制器属性(参与查询参数)
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);
}
});
为什么你需要观察者?只需在控制器的 changeApp 操作中直接设置服务的 appName:this.set('myService.appName','Kumkanillam');
并完全删除观察者。
你的问题变成了……您的评论后有所不同。让我用以下 twiddle 澄清一下我是否正确理解了你的问题。在这种情况下;您正在控制器和组件上修改 appName;这是违反 DDAU 原则的例证。在这种情况下,您需要控制器内部的观察者,以便在组件级别收到有关 appName 更改的通知。
为了解决这个问题;您可以在控制器级别创建别名计算 属性 并将其传递给组件(或其他组件或路由模板),您将摆脱观察者。这 twiddle 解释了我的意思。
即使我理解的是正确的并且我提供的可能是有效的答案;不要忘记违反 DDAU 会在某些时候伤害你,你将不得不在未来重构你的代码。希望这有帮助。
我将状态属性从控制器移动到服务,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);
}
});
为什么你需要观察者?只需在控制器的 changeApp 操作中直接设置服务的 appName:this.set('myService.appName','Kumkanillam');
并完全删除观察者。
你的问题变成了……您的评论后有所不同。让我用以下 twiddle 澄清一下我是否正确理解了你的问题。在这种情况下;您正在控制器和组件上修改 appName;这是违反 DDAU 原则的例证。在这种情况下,您需要控制器内部的观察者,以便在组件级别收到有关 appName 更改的通知。
为了解决这个问题;您可以在控制器级别创建别名计算 属性 并将其传递给组件(或其他组件或路由模板),您将摆脱观察者。这 twiddle 解释了我的意思。
即使我理解的是正确的并且我提供的可能是有效的答案;不要忘记违反 DDAU 会在某些时候伤害你,你将不得不在未来重构你的代码。希望这有帮助。