我有一个父母route
。在此路线内,有一个渲染的组件。
route
有一个包含HTML div元素的template.hbs
文件。我需要能够从我的孩子component
中更改此div元素的类。
为此,我正计划使用一项服务。正在将服务注入route
和子component
中的想法,然后将div的类绑定到服务的属性。然后,当我将服务注入子组件时,我可以更改属性并查看父路由反映的任何更改。
问题是,绑定似乎不起作用!
父母路线:
模板:
<div class={{model.containerClass}}>
Route.js:
dashboardContainerManager: service('dashboard-container-manager'),
afterModel(model) {
model.set('containerClass', this.get('dashboardContainerManager').dashboardContainerClass);
服务:
export default Service.extend({
dashboardContainerClass: null,
init() {
debugger; //placed to ensure one instance being made
this._super(...arguments);
this.set('dashboardContainerClass', 'container dashboard-container'); //need to set it here to prevent glimmer error
},
changeContainerClass(newClass) {
debugger;
this.set('dashboardContainerClass', newClass);
}
});
子组件:
dashboardContainerManager: service('dashboard-container-manager'),
init() {
this._super(...arguments);
this.get('dashboardContainerManager').changeContainerClass('test');
},
以上代码的结果是,我的div的类最初设置为“ containerdashboard-container”,因为这是服务上的dashboardContainerClass
属性被初始化为的值。但是,当在组件内部将值更改为“ test”时,div的类未更新,这表明它未正确绑定到dashboardContainerClass
的值。我也尝试在不同的地方使用计算属性,但是什么也没用。
我在这里做错什么了!!
答案 0 :(得分:2)
有一个reads
计算属性宏可以在这里为您提供帮助:
https://emberjs.com/api/ember/3.7/functions/@ember%2Fobject%2Fcomputed/reads
在您的组件中,您只需执行以下操作即可:
import { reads } from '@ember/object/computed';
// ...
dashboardContainerManager: service('dashboard-container-manager'),
containerClass: reads('dashboardContainerManager.dashboardContainerClass'),
服务:
export default Service.extend({
dashboardContainerClass: 'container dashboard-container',
changeContainerClass(newClass) {
this.set('dashboardContainerClass', newClass);
}
});
路线:
export default Route.extend({
// removed afterModel and service injection
});
控制器:
export default Controller.extend({
containerManager: service('dashboard-container-manager'),
containerClass: reads('containerManager.dashboardContainerClass'),
});
模板:
<div class='some-other-class {{containerClass}}'>
other stuff
</div>