如何在禁用后重新渲染ng2-chart图表?
解决Angular中控制柱状图显示/隐藏无效的问题
嘿,我碰到过类似的坑,咱们一步步来捋清楚问题所在,然后搞定它!你现在的情况应该是组件间通信的方式用错了,EventEmitter可不是用来从父组件给子组件传值的,先纠正这个误区,再给你具体的解决方案:
为什么之前的方法无效?
EventEmitter是子组件向父组件发送事件/数据的工具,反过来如果父组件(app.component)要控制子组件(BarGraphComponent)的状态,得用@Input()装饰器来实现父传子的属性绑定,而不是用EventEmitter。这就是你设置showBar=true后没反应的核心原因。
具体修改步骤
1. 改造BarGraphComponent,添加@Input属性
把原来的showBar改成带@Input()装饰器的属性,让它能接收父组件传递的值:
import { Component, OnInit, Input } from '@angular/core'; export class BarGraphComponent implements OnInit { // 初始值设为false,和你之前OnInit里的逻辑保持一致 @Input() showBar: boolean = false; ngOnInit() { // 这里不用再手动赋值showBar了,@Input会从父组件拿到值 } // 你的其他方法(chartHovered、chartClicked)保持不变 }
2. 在app.component中绑定子组件的showBar属性
首先在app.component的HTML模板里,给BarGraphComponent绑定showBar属性,把父组件里的状态传进去:
<!-- 假设你的子组件选择器是app-bar-graph --> <app-bar-graph [showBar]="shouldShowBar"></app-bar-graph>
然后在app.component.ts里定义shouldShowBar变量,在switch语句中修改它的值:
export class AppComponent { shouldShowBar: boolean = false; // 假设这是你处理前一个图表传递内容的方法 handleChartSwitch(chartContent: any) { switch(chartContent.type) { case 'bar': this.shouldShowBar = true; console.log("切换到柱状图,showBar设为true"); // 加个日志调试确认 break; default: this.shouldShowBar = false; break; } } }
3. 额外检查点(避免踩坑)
- 确认你的BarGraphComponent已经在模块的
declarations数组里注册了,不然父组件找不到它。 - 检查switch语句是否真的走到了
case 'bar'分支,可以通过console.log确认。 - 如果你的组件用了
ChangeDetectionStrategy.OnPush,那确保@Input的值确实发生了变化(比如不要传同一个对象引用,要传原始值或者新对象),不过这里用的是boolean值,Angular会自动检测变化。
这样修改之后,当你在app.component的switch语句中把shouldShowBar设为true时,子组件的showBar会跟着更新,*ngIf就会生效,柱状图就显示出来啦!
内容的提问来源于stack exchange,提问作者sharsart
相关产品推荐
相关产品推荐

