【发布时间】:2020-01-29 20:13:47
【问题描述】:
我正在尝试根据子输出对父组件进行操作,但我得到了
表达式在检查后发生了变化。以前的值:'ngIf: [对象对象]'。当前值:'ngIf: true'。
这是我的代码:
父组件html
<div *ngIf="hasErrors">!</div>
<app-error [valuesForErrors]="..." (hasErrors)="setHasErrors($event)"></app-error>
父组件ts(节)
export class InputComponent implements OnInit {
hasErrors = false;
...
setHasErrors(hasErrors) {
this.hasErrors = hasErrors;
}
我从 rxjs 看到了一些带有 Subject 和 Observable 的解决方案,但它们在我的项目中不起作用:/
编辑
一位朋友帮我提供了另一个解决方案,只需在声明中使用 true 使发射器异步:
子组件 ts
export class ErrorComponent implements OnInit, OnChanges {
@Input() valuesForErrors: any;
@Output() hasErrors: EventEmitter<boolean> = new EventEmitter<boolean>(true);
...
ngOnChanges(changes: SimpleChanges): void {
this.calculateErrors()
}
calculateErrors() {
let errors = ... some logic that returns a boolean;
this.hasErrors.emit(errors);
}
}
【问题讨论】:
-
您从子函数 calculateErrors 发出的“错误”的值是多少?
-
一个基于 valuesForErrors 计算的布尔值
-
您在这里使用的方法——子组件计算状态(
hasErrors)然后将其传播到父组件——似乎违反了“单向数据流”原则。如果将错误计算移到使用它的组件层次结构的最高点(即ParentComponent),然后让父级将其作为输入绑定提供给子级,从长远来看,它可能会简化事情。这也可能会修复错误。 -
有时它与template hierarchy 有关 - 如果是这种情况,请将
<div *ngIf="hasErrors">!</div>包装在<div *ngIf="true">!</div>中 -
@AndrewAllen 你是个疯子,这就像一个魅力,我仍然不明白为什么......非常感谢。请把它作为一个答案。