Angular 在 运行 中单击后停止组件
Angular stop component from running after it has been clicked off of
目前,我有一个边栏,可以让我单击各个组件。这些组件刷新 API 调用以获取数据。但是,当我将组件单击到另一个组件时,旧组件会继续刷新 API 数据,即使我已单击它时不需要它。
下面是一个测试组件。当我单击该组件时,它会打印出“测试组件仍处于活动状态”。当我从该组件单击另一个组件时,它仍然显示“测试组件仍然处于活动状态”,这告诉我该组件仍然是 运行。有没有办法在我单击后关闭该组件?还是有更好的获取新数据的方法?
export class TestComponent implements OnInit {
userActivity;
constructor(
) { }
ngOnInit() {
this.refreshData();
}
refreshData(){
this.userActivity = setTimeout(() => {
// where api data is called out
console.log('test component is still active');
this.refreshData();
}, 5000);
}
}
在处理异步代码(例如订阅或 Angular 组件内的 setTimeout()
时,这是一个非常常见的问题。 Angular 不会自动取消订阅或“杀死”此类异步代码 - 您必须处理它。
根据具体问题,有多种方法可以处理此问题。在您的情况下,您已经将 setTimeout
返回的句柄存储在 userActivity
中。您可以使用此句柄并清除 Angular 的 OnDestroy lifecycle hook 内的超时。将 OnDestroy
视为 OnInit
的对应物,它会在组件被销毁时调用。
export class TestComponent implements OnInit, OnDestroy {
userActivity;
constructor() {}
ngOnInit() {
this.refreshData();
}
refreshData() {
this.userActivity = setTimeout(() => {
// where api data is called out
console.log('test component is still active');
this.refreshData();
}, 1000);
}
ngOnDestroy() {
clearTimeout(this.userActivity);
}
}
您可以在 this Stackblitz 中看到它的实际效果。如果您查看控制台输出,您应该会看到,一旦您从组件 1 切换到组件 2,您的 console.log 就不再被记录。
目前,我有一个边栏,可以让我单击各个组件。这些组件刷新 API 调用以获取数据。但是,当我将组件单击到另一个组件时,旧组件会继续刷新 API 数据,即使我已单击它时不需要它。
下面是一个测试组件。当我单击该组件时,它会打印出“测试组件仍处于活动状态”。当我从该组件单击另一个组件时,它仍然显示“测试组件仍然处于活动状态”,这告诉我该组件仍然是 运行。有没有办法在我单击后关闭该组件?还是有更好的获取新数据的方法?
export class TestComponent implements OnInit {
userActivity;
constructor(
) { }
ngOnInit() {
this.refreshData();
}
refreshData(){
this.userActivity = setTimeout(() => {
// where api data is called out
console.log('test component is still active');
this.refreshData();
}, 5000);
}
}
在处理异步代码(例如订阅或 Angular 组件内的 setTimeout()
时,这是一个非常常见的问题。 Angular 不会自动取消订阅或“杀死”此类异步代码 - 您必须处理它。
根据具体问题,有多种方法可以处理此问题。在您的情况下,您已经将 setTimeout
返回的句柄存储在 userActivity
中。您可以使用此句柄并清除 Angular 的 OnDestroy lifecycle hook 内的超时。将 OnDestroy
视为 OnInit
的对应物,它会在组件被销毁时调用。
export class TestComponent implements OnInit, OnDestroy {
userActivity;
constructor() {}
ngOnInit() {
this.refreshData();
}
refreshData() {
this.userActivity = setTimeout(() => {
// where api data is called out
console.log('test component is still active');
this.refreshData();
}, 1000);
}
ngOnDestroy() {
clearTimeout(this.userActivity);
}
}
您可以在 this Stackblitz 中看到它的实际效果。如果您查看控制台输出,您应该会看到,一旦您从组件 1 切换到组件 2,您的 console.log 就不再被记录。