Ember:如何将HTMLclass绑定到服务属性,使class是动态的
Ember: how to bind HTML class to Service property, so that class is dynamic
我有一个parentroute
。在这条路线中有一个组件被渲染。
route
有一个包含 HTML div 元素的 template.hbs
文件。我需要能够从我的 child component
.
中更改此 div 元素的 class
为此,我打算使用一项服务。将服务注入 route
和 child component
然后将 div 的 class 绑定到 属性服务。然后,当我将服务注入 child 组件时,我可以更改 属性 并查看 parent 路由反映的任何更改。
问题是,绑定似乎不起作用!
Parent路线:
模板:
<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);
}
});
Child 分量:
dashboardContainerManager: service('dashboard-container-manager'),
init() {
this._super(...arguments);
this.get('dashboardContainerManager').changeContainerClass('test');
},
上面代码的结果是我的div的class最初设置为"container dashboard-container"因为那是dashboardContainerClass
[=69=的值] 在我的服务上被初始化为。但是,当我的组件中的值更改为 "test" 时,我的 div 的 class 没有更新,这表明它没有正确绑定到 dashboardContainerClass
的值。我也尝试在不同的地方使用计算 属性,但无法正常工作。
我哪里做错了?!
这里有一个 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>
我有一个parentroute
。在这条路线中有一个组件被渲染。
route
有一个包含 HTML div 元素的 template.hbs
文件。我需要能够从我的 child component
.
为此,我打算使用一项服务。将服务注入 route
和 child component
然后将 div 的 class 绑定到 属性服务。然后,当我将服务注入 child 组件时,我可以更改 属性 并查看 parent 路由反映的任何更改。
问题是,绑定似乎不起作用!
Parent路线:
模板:
<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);
}
});
Child 分量:
dashboardContainerManager: service('dashboard-container-manager'),
init() {
this._super(...arguments);
this.get('dashboardContainerManager').changeContainerClass('test');
},
上面代码的结果是我的div的class最初设置为"container dashboard-container"因为那是dashboardContainerClass
[=69=的值] 在我的服务上被初始化为。但是,当我的组件中的值更改为 "test" 时,我的 div 的 class 没有更新,这表明它没有正确绑定到 dashboardContainerClass
的值。我也尝试在不同的地方使用计算 属性,但无法正常工作。
我哪里做错了?!
这里有一个 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>