有没有办法在 Angular 中触发更改检测,以便在删除元素时更新视图中的数组?
Is there a way to trigger change detection in Angular to update an array in the view when an element is removed?
我有这个组件与客户 属性。
import { Component } from '@angular/core';
@Component({
selector: 'app-update-view',
templateUrl: './update-view.component.html',
styles: [
]
})
export class UpdateView {
public client: string[] = ['client 1', 'client 2', 'client 3', 'client 4'];
constructor() { }
deleteClient() {
this.client.pop();
}
}
在html中我打印了这样的对象。
<div class="col md:col-6">
<div>
<strong>Client</strong>
<pre>{{ Client }}</pre>
</div>
<button (click)="deleteClient()">Delete Client</button>
</div>
我知道这不是打印数组的方法,我应该使用 'ngFor 并逐一打印项目,但我想知道是否有办法更新 html 中的数组删除客户端后,因为正确知道当我单击删除客户端时,html 中的数组保持不变。
出于好奇问这个问题,我知道这种打印数组的方式不正确,但我想知道是否有任何方法可以更新视图。
尝试使用 json 管道,并更改 <pre>{{ client | json }}</pre>
而不是 <pre>{{ Client }}</pre>
。
<div class="col md:col-6">
<div>
<strong>Client</strong>
<pre>{{ client | json }}</pre>
</div>
<button (click)="deleteClient()">Delete Client</button>
</div>
您问题的直接答案是注入 ChangeDetectionRef
并调用 markForCheck
。
export class UpdateView {
public client: string[] = ['client 1', 'client 2', 'client 3', 'client 4'];
constructor(private cdr: ChangeDetectionRef) { }
deleteClient() {
this.client.pop();
this.cdr.markForCheck();
}
}
但真正的答案是弄清楚为什么这不更新?您正在执行的编码类型称为“可变”编码。这就是人们在 AngularJS 中编写代码的方式。改变对象然后 运行 在这些对象上进行变化检测是 AngularJS 的变化检测周期如此缓慢的原因。 Angular 的变化检测的工作方式是,如果对对象(在本例中为数组)的引用是对不同对象的引用,则它仅对对象进行 运行 的变化检测。由于您正在调用 pop
,您指向同一个数组,因此 Angular 不太可能 运行 CD 在其上。
下面的代码会得到你想要的并触发 Angular 的 CD。以下代码将this.client
更新为一个新数组,它会自动获取UI进行更新。
// THIS IS THE RIGHT ANSWER!!!
this.client = this.client.slice(0, -1);
通过这样做,您将依靠不可变编程,这使得更改检测更快、更便宜。
我有这个组件与客户 属性。
import { Component } from '@angular/core';
@Component({
selector: 'app-update-view',
templateUrl: './update-view.component.html',
styles: [
]
})
export class UpdateView {
public client: string[] = ['client 1', 'client 2', 'client 3', 'client 4'];
constructor() { }
deleteClient() {
this.client.pop();
}
}
在html中我打印了这样的对象。
<div class="col md:col-6">
<div>
<strong>Client</strong>
<pre>{{ Client }}</pre>
</div>
<button (click)="deleteClient()">Delete Client</button>
</div>
我知道这不是打印数组的方法,我应该使用 'ngFor 并逐一打印项目,但我想知道是否有办法更新 html 中的数组删除客户端后,因为正确知道当我单击删除客户端时,html 中的数组保持不变。
出于好奇问这个问题,我知道这种打印数组的方式不正确,但我想知道是否有任何方法可以更新视图。
尝试使用 json 管道,并更改 <pre>{{ client | json }}</pre>
而不是 <pre>{{ Client }}</pre>
。
<div class="col md:col-6">
<div>
<strong>Client</strong>
<pre>{{ client | json }}</pre>
</div>
<button (click)="deleteClient()">Delete Client</button>
</div>
您问题的直接答案是注入 ChangeDetectionRef
并调用 markForCheck
。
export class UpdateView {
public client: string[] = ['client 1', 'client 2', 'client 3', 'client 4'];
constructor(private cdr: ChangeDetectionRef) { }
deleteClient() {
this.client.pop();
this.cdr.markForCheck();
}
}
但真正的答案是弄清楚为什么这不更新?您正在执行的编码类型称为“可变”编码。这就是人们在 AngularJS 中编写代码的方式。改变对象然后 运行 在这些对象上进行变化检测是 AngularJS 的变化检测周期如此缓慢的原因。 Angular 的变化检测的工作方式是,如果对对象(在本例中为数组)的引用是对不同对象的引用,则它仅对对象进行 运行 的变化检测。由于您正在调用 pop
,您指向同一个数组,因此 Angular 不太可能 运行 CD 在其上。
下面的代码会得到你想要的并触发 Angular 的 CD。以下代码将this.client
更新为一个新数组,它会自动获取UI进行更新。
// THIS IS THE RIGHT ANSWER!!!
this.client = this.client.slice(0, -1);
通过这样做,您将依靠不可变编程,这使得更改检测更快、更便宜。