【问题标题】:Detect Browser or tab close - Angular检测浏览器或标签关闭 - Angular
【发布时间】:2020-02-09 19:02:32
【问题描述】:

我有一个 Angular 8 Web 应用程序,只要在我的应用程序运行时关闭浏览器或关闭浏览器选项卡,就会调用 API。我试过下面的代码

    @Component({
     selector: 'app-root',
     templateUrl: './app.component.html',
     styleUrls: ['./app.component.scss']
    })
    export class AppComponent {
     @HostListener('window:beforeunload', ["$event"]) unload(event) {
        //calling api
     }
    }

api 的逻辑(变量和函数中的数据)按预期运行,但仅当我调整浏览器窗口大小(检查元素)或添加任何断点时。 我也试过https://v8.angular.io/api/core/Directive#host属性。
我是否将侦听器添加到错误的组件或 DOM 对象或侦听器被删除或未添加。

【问题讨论】:

    标签: javascript angular angular-material dom-events


    【解决方案1】:

    卸载事件可以在调用之前完成并关闭窗口。

    请参阅本文以在 ngOnDestroy 中运行异步调用,并确保在窗口关闭事件(尤其是热点提示 #1 和 #2 部分)时调用 ngOnDestroy。

    详细说明了如何完成对窗口卸载事件的服务调用。 Wesley Grimes Angular ngOnDestroy upgrades

    这是我在 app.component 中使用它的方法,当我关闭浏览器窗口时,它会向数据库添加一条记录:

    注意 - 一些导入可能不相关,只是从我的应用中复制代码。

    app.component.ts:

    import { Component, OnInit, ViewChild, ElementRef, Renderer2, Input, Output, EventEmitter, HostListener, OnDestroy  } from '@angular/core';
    

    ...

    export class AppComponent implements OnInit, OnDestroy {
    

    ...

     @HostListener('window:beforeunload')
      async ngOnDestroy()
      {
        await this.myService.AddItem().subscribe();
      }
    

    my-service.ts:

     AddItem(): Observable<any>
     {
      return this.http.get<any>(environment.apiURL + 'items/AddItem', httpOptions);
     }
    

    【讨论】:

    • 我尝试了两种使用 ngOnDestroy 的技术都没有锻炼。
    • 为我工作。我已经编辑了我的答案以显示我使用的相关代码,
    • 每次都在我的身上工作。你的类声明中有实现 OnDestroy 吗?此外,如果您将代码添加到应用程序组件中的另一个组件,当该组件被销毁时,ngOnDestroy 中的断点是否会受到影响?例如,通过导航离开组件?您是否还检查了已开发工具中的网络选项卡以查看是否正在拨打服务电话?
    • 还必须对您的 ngOnDestroy 声明进行异步处理并等待其中的服务调用?
    • 是的。我刚刚用你的更改运行了我的应用程序,它只在 Firefox、Chrome 和 Edge 上运行,主机监听器代码没有得到执行。我在其他机器上运行同样的项目同样的问题。
    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多