typescript Angular ngOnDestroy是否在服务内部运行?

hlswsv35  于 2022-12-14  发布在  TypeScript
关注(0)|答案(3)|浏览(146)

我有一个服务,这个服务应该一直运行到项目启动和关闭。在应用程序(网站)关闭后,服务的ngondestroy方法应该运行。我如何知道服务中的ngondestroy方法是否工作?这个ngondestroy工作吗?

export class UserServiceService implements OnDestroy{
subsc : Subscription
constructor(private auth : AngularFireAuth,private db : AngularFireDatabase,private fnc:AngularFireFunctions,private router : Router,private tostr : ToastrService) {

 this.subsc =    this.auth.authState.subscribe((user) => {
      if (user) {
         this.db.database.ref("users/"+user.uid+"/shopCart/").on("value",snap=>{
         })
      } else {
        //not user
      }
    });
  }

  ngOnDestroy(): void {
    console.log("Closed")
    this.subsc.unsubscribe()
    this.db.database.ref("users/"+this.currentUserId+"/shopCart/").off()
  }
}
xvw2m8pv

xvw2m8pv1#

正如@nate-kumar所说,当用户关闭浏览器时,angular不会触发ngOnDestroy生命周期钩子。

实现此目的的最佳解决方法是使用以下方法:

export class AppComponent {
  @HostListener('window:unload', [ '$event' ])
  unloadHandler(event) {
    // do the needful here
  }

  @HostListener('window:beforeunload', [ '$event' ])
  beforeUnloadHandler(event) {
    // do the need full here
  }
}

请找到正在工作的stakblitz here

wko9yo5t

wko9yo5t2#

不幸的是,ngOnDestroy在浏览器窗口关闭时不会触发,它只在组件/服务/指令被破坏而Angular应用程序仍在运行时触发。
如果您需要在浏览器窗口关闭时触发逻辑,一些解决方案涉及到在window对象上使用onbeforeunload挂钩:
请参阅ngOnDestroy not firing on page reload

bxgwgixi

bxgwgixi3#

默认情况下,Angular 服务不使用ngOnDestroy,但...
在服务中实现ngOnDestroy时,可以将其链接到组件ngOnDestroy
这意味着当组件将销毁ngOnDestroy时,服务的ngOnDestroy也将得到调用。
如果您想取消订阅或删除不再需要的数据,这将非常有用。
为了将服务ngOnDestroy链接到组件ngOnDestroy,请将其添加到组件提供程序并在服务中实现ngOnDestroy

@Component({
  selector: 'app-test',
  templateUrl: './app-test.component.html',
  styleUrls: ['./app-test.component.scss'],
  providers: [YourService],

})

但是对于您提到的情况,请检查此ngOnDestroy not firing on page reload

相关问题