Angular 8 值在更改后不会在视图中更新
Angular 8 value won't update on view after change
我在 Angular 中有一个小组件,其方法(目前)设置超时并更改变量的值。
import { Component, ChangeDetectionStrategy } from '@angular/core';
@Component({
selector: 'my-component',
templateUrl: './my-view.html',
styleUrls: ['./my-view.scss'],
changeDetection: ChangeDetectionStrategy.Default
})
export class MyComponent {
status: boolean = false;
changeStatus(): void {
setTimeout(() => {
this.status = true;
}, 1500);
}
}
和HTML
<div>
<form #myForm="ngForm">
<input name="code" type="text" class="form-control" [(ngModel)]="code" #codeInput="ngModel" required placeholder="Enter your code" />
</form>
</div>
<div class="row">
<div class="col-md-5" (click)="changeStatus()">
<mat-icon aria-label="clear-all" *ngIf="!status"></mat-icon>
<a>Change status</a>
</div>
<div class="col-md-7">
<button type="button" class="btn-flat app-btn-flat">Cancel</button>
<button type="button" class="btn app-btn" [disabled]="myForm.invalid || myForm.pristine">Save</button>
</div>
</div>
如果我在组件中记录 'status' 的值。我得到 'true' 的新值,但它不会在视图上改变,除非我将光标聚焦在输入上,然后单击它以外的任何地方。
为什么会这样?我该如何解决?
您在正常的变更检测周期之外执行此操作。这将起作用:
export class MyComponent {
status: boolean = false;
constructor(private _cdr: ChangeDetectorRef) { }
changeStatus(): void {
setTimeout(() => {
this.status = true;
this._cdr.detectChanges()
}, 1500);
}
}
编辑:它会在您与 UI 的下一次交互时更新,因为 angular 是 运行 它是那个时间点的更改检测它捕获组件中的更改并更新 UI。如果您正在异步执行操作(除非您正在使用 angular API,例如 HttpService),那么您必须手动告诉 ChangeDetector 有更改。
为什么会这样?
您在其中一个祖先组件中将 changeDetection
设置为 OnPush
。 属性 不能被覆盖。参考:https://angular.io/api/core/ChangeDetectionStrategy
如何解决?
在祖先组件中取消设置 changeDetection
,或者像 Adam 的回答那样手动检测更改。
constructor(private _cdr: ChangeDetectorRef) {}
changeStatus(): void {
setTimeout(() => {
this.status = true;
this._cdr.detectChanges()
}, 1500);
}
我在 Angular 中有一个小组件,其方法(目前)设置超时并更改变量的值。
import { Component, ChangeDetectionStrategy } from '@angular/core';
@Component({
selector: 'my-component',
templateUrl: './my-view.html',
styleUrls: ['./my-view.scss'],
changeDetection: ChangeDetectionStrategy.Default
})
export class MyComponent {
status: boolean = false;
changeStatus(): void {
setTimeout(() => {
this.status = true;
}, 1500);
}
}
和HTML
<div>
<form #myForm="ngForm">
<input name="code" type="text" class="form-control" [(ngModel)]="code" #codeInput="ngModel" required placeholder="Enter your code" />
</form>
</div>
<div class="row">
<div class="col-md-5" (click)="changeStatus()">
<mat-icon aria-label="clear-all" *ngIf="!status"></mat-icon>
<a>Change status</a>
</div>
<div class="col-md-7">
<button type="button" class="btn-flat app-btn-flat">Cancel</button>
<button type="button" class="btn app-btn" [disabled]="myForm.invalid || myForm.pristine">Save</button>
</div>
</div>
如果我在组件中记录 'status' 的值。我得到 'true' 的新值,但它不会在视图上改变,除非我将光标聚焦在输入上,然后单击它以外的任何地方。
为什么会这样?我该如何解决?
您在正常的变更检测周期之外执行此操作。这将起作用:
export class MyComponent {
status: boolean = false;
constructor(private _cdr: ChangeDetectorRef) { }
changeStatus(): void {
setTimeout(() => {
this.status = true;
this._cdr.detectChanges()
}, 1500);
}
}
编辑:它会在您与 UI 的下一次交互时更新,因为 angular 是 运行 它是那个时间点的更改检测它捕获组件中的更改并更新 UI。如果您正在异步执行操作(除非您正在使用 angular API,例如 HttpService),那么您必须手动告诉 ChangeDetector 有更改。
为什么会这样?
您在其中一个祖先组件中将 changeDetection
设置为 OnPush
。 属性 不能被覆盖。参考:https://angular.io/api/core/ChangeDetectionStrategy
如何解决?
在祖先组件中取消设置 changeDetection
,或者像 Adam 的回答那样手动检测更改。
constructor(private _cdr: ChangeDetectorRef) {}
changeStatus(): void {
setTimeout(() => {
this.status = true;
this._cdr.detectChanges()
}, 1500);
}