记录一次莫名其妙的Bug (Angular生命周期)
发布:2023-12-07 02:48
更新:2023-12-07 07:12
作者: 0xdFFF
浏览: 334
分类:
技术分享
字数:1744
前言
ing 前言
今天上班发现一个很奇怪的Bug,在angular子父组件传值的地方有时候会导致@input被执行两次
其中的 [mrbScrapTask]=”model” 在s1、s2组件被污染,导致s3的mrbScrapTask的model被污染,然后被加载两次
<util-row class="dock-panel bg flex1">
<util-tabset class="page-line-tabs" [nzAnimated]="false">
<util-tab title="X">
<s1 class="w100 h100 pd-b mg-b" [isDetail]=isDetail [mrbScrapTask]="model" [defectiveStatus]="model.scrapStatus" (defectDataChangedEvent)="defectDataChangedEvent()" (mrbScrapDetailComponentInte)="loadById($event)"></11>
</util-tab>
<util-tab title="X">
<s2 class="w100 h100 pd-b mg-b" [mrbScrapTask]="model" [isDetail]=isDetail [defectiveStatus]="model.scrapStatus"></s2>
</util-tab>
<util-tab title="X">
<s3 class="w100 h100 pd-b mg-b" [mrbScrapTask]="model" [isDetail]=isDetail [defectiveStatus]="model.scrapStatus"></s3>
</util-tab>
</util-tabset>
</util-row>
angular接收值
@Input()
get mrbScrapTask(): MrbScrapViewModel {
return this._mrbScrapTask;
}
set mrbScrapTask(value) {
this._mrbScrapTask = value;
let mrbScrapTaskId = value ? value.id : "00000000-0000-0000-0000-000000000000";
if (this.timeout) {
clearTimeout(this.timeout);
}
this.timeout = setTimeout(() => {
if (value) {
//重复执行
debugger;
this.queryParam.mrbScrapId = mrbScrapTaskId;
this.query();
}
}, 300);
}
可能导致的原因
- model改变 导致input被执行了两次
- @input被重复调用
- model属性的值是通过异步操作获取的
解决方法
-- 完结 --