我对这个问题有类似的问题,但似乎这个问题已经过时了,因为这两个答案都不适合我。
子组件只是从一个称为Proposal
作为输入传递的复杂对象中呈现数据(它根本没有用户控件,因此不需要触发任何事件或传递任何东西)。
@Component({
selector: 'fb-proposal-document',
templateUrl: './proposal-document.component.html',
styleUrls: ['./proposal-document.component.css']
})
export class ProposalDocumentComponent implements OnInit, OnDestroy {
@Input() proposal: Proposal;
constructor()
}
模板的相关部分是,迭代一个数组并检查一个属性以显示不同的文本,使用*ngIf
:
<li class="section" *ngFor="let qp of proposal?.quoted_products">
<li class="section" *ngFor="let room of qp?.rooms">
...
<div class="row">
<div class="col-md-12">
Supply
<span *ngIf="room.is_fitted">
and install
</span>
<span *ngIf="!room.is_fitted">
only
</span>
</div>
</div>
...
</li>
</li>
在父级中,用户可以单击复选框将“is_fitted”更改为 true 或 false。父级使用域驱动器形式。在ngOnInit
父母是这个代码:
this.myForm.controls['isFitted'].valueChanges.subscribe(
value => {
this.proposal.is_fitted = value;
let qp = this.proposal.quoted_products[this.qpCurrentIndex];
qp.rooms.forEach(function(room) {
room.is_fitted = value;
});
}
);
正确更新属性。我可以看到,如果我console.log
这样做。*ngIf
所以问题是,当嵌入的room.is_fitted
值发生变化时,如何让孩子重新触发/重新处理?
我已经尝试使用 ViewChild 实现这个想法,因此 ngOnInit 中的上述代码变为:
this.myForm.controls['isFitted'].valueChanges.subscribe(
value => {
this.proposal.is_fitted = value;
let qp = this.proposal.quoted_products[this.qpCurrentIndex];
qp.rooms.forEach(function(room) {
room.is_fitted = value;
});
this.proposalDocument.notifyChange(this.proposal);
}
);
但这也不起作用。我在孩子中的 notifyChange 被成功调用:
notifyChange(proposal: Proposal) {
console.log('I changed');
this.proposal = proposal;
}
但视图不会更新 -*ngIf
逻辑不会被重新处理。