如何 运行 Angular 中 ngAfterViewChecked 生命周期钩子中的一次性方法
how to run a onetime method inside ngAfterViewChecked life cycle hook in Angular
我有一个需要跟踪的变量更改,我想 运行 在发生此类更改后使用一些功能。所以,我正在使用 ngAfterViewChecked 挂钩 运行 函数。但是,这种方法是一种数据提交。所以,它只需要运行一次所以,我使用了一个状态布尔变量来处理这个,如下所示。
ngAfterViewChecked()
{
//status is a boolean variable which is true
if (this.status)
{
this.status=!this.status;
this.myFunction();
}
}
myFunction
{
//some code
}
但是,我在这种方法中检测到多个数据提交(在检查数据库后验证)并且我也收到以下错误。
ERROR 错误:ExpressionChangedAfterItHasBeenCheckedError:表达式在检查后已更改。 “@dialogContainer”的先前值:'enter'。当前值:'exit'.
据我所知,每次 change.So 都会触发 ngAfterViewChecked 我的猜测是,在将状态更改为 false 之前,另一个实例已执行 if (this.status) {} 之前更改为 false。
有办法解决这个问题吗?
经过几个小时的搜索,我能够克服 it.This 我是如何做到的 it.I 将从对我的解决方案的一些解释开始。
- Angular 在浏览器中工作。浏览器 运行 JavaScript.Javascript 代码在单线程中执行,但 Javascript 运行 时间不是 运行 在单线程中执行。我们不必担心,因为运行时会处理它。
- 主题是可观察的。它可用于向正在收听它的任意数量的观察者发出一个值
- 订阅可以持有一个 observable
首先,我创建了一个名为 paymentListener 的主题、一个名为 counter 的整数变量和一个名为 oneTimePayment 的订阅。
oneTimePayment: Subscription;
private paymentListener = new Subject<number>();
counter = 0;
然后在 onInit 方法中,我进行了订阅。
ngOnInit() {
this.oneTimePayment = this.paymentListener.subscribe((counter) => {
if (counter == 1) {
//this is my function
this.myFunction();
}
});
}
然后在 ngAfterViewChecked 生命周期挂钩中,我使用 paymentListener(这是一个 Subject)来发出计数器值。
ngAfterViewChecked() {
if (this.counter == 0) {
this.counter++;
if (this.counter == 1) {
this.paymentListener.next(this.counter);
}
}
}
因为,只有当计数器等于 1 时,paymentListener (Subject) 才会发出该值。因此,在 onInt 内部进行的订阅将获得发出的值,并且我只执行 myFunction()如果发出的值等于 1;
这确保该方法在更改后仅 运行ning 一次。
最后,确保在ngOnDestroy中调用取消订阅。否则会导致内存泄漏。
ngOnDestroy() {
this.oneTimePayment.unsubscribe();
}
我有一个需要跟踪的变量更改,我想 运行 在发生此类更改后使用一些功能。所以,我正在使用 ngAfterViewChecked 挂钩 运行 函数。但是,这种方法是一种数据提交。所以,它只需要运行一次所以,我使用了一个状态布尔变量来处理这个,如下所示。
ngAfterViewChecked()
{
//status is a boolean variable which is true
if (this.status)
{
this.status=!this.status;
this.myFunction();
}
}
myFunction
{
//some code
}
但是,我在这种方法中检测到多个数据提交(在检查数据库后验证)并且我也收到以下错误。
ERROR 错误:ExpressionChangedAfterItHasBeenCheckedError:表达式在检查后已更改。 “@dialogContainer”的先前值:'enter'。当前值:'exit'.
据我所知,每次 change.So 都会触发 ngAfterViewChecked 我的猜测是,在将状态更改为 false 之前,另一个实例已执行 if (this.status) {} 之前更改为 false。
有办法解决这个问题吗?
经过几个小时的搜索,我能够克服 it.This 我是如何做到的 it.I 将从对我的解决方案的一些解释开始。
- Angular 在浏览器中工作。浏览器 运行 JavaScript.Javascript 代码在单线程中执行,但 Javascript 运行 时间不是 运行 在单线程中执行。我们不必担心,因为运行时会处理它。
- 主题是可观察的。它可用于向正在收听它的任意数量的观察者发出一个值
- 订阅可以持有一个 observable
首先,我创建了一个名为 paymentListener 的主题、一个名为 counter 的整数变量和一个名为 oneTimePayment 的订阅。
oneTimePayment: Subscription;
private paymentListener = new Subject<number>();
counter = 0;
然后在 onInit 方法中,我进行了订阅。
ngOnInit() {
this.oneTimePayment = this.paymentListener.subscribe((counter) => {
if (counter == 1) {
//this is my function
this.myFunction();
}
});
}
然后在 ngAfterViewChecked 生命周期挂钩中,我使用 paymentListener(这是一个 Subject)来发出计数器值。
ngAfterViewChecked() {
if (this.counter == 0) {
this.counter++;
if (this.counter == 1) {
this.paymentListener.next(this.counter);
}
}
}
因为,只有当计数器等于 1 时,paymentListener (Subject) 才会发出该值。因此,在 onInt 内部进行的订阅将获得发出的值,并且我只执行 myFunction()如果发出的值等于 1; 这确保该方法在更改后仅 运行ning 一次。
最后,确保在ngOnDestroy中调用取消订阅。否则会导致内存泄漏。
ngOnDestroy() {
this.oneTimePayment.unsubscribe();
}