簡體   English   中英

Angular 4 自定義裝飾器 - 注入服務

[英]Angular 4 Custom decorator - injecting services

我想在我的應用程序中創建一個身份驗證裝飾器。

用法示例應該很簡單

@RequireAuthentication()
@HostListener('click', ['$event']) onClick(event: Event) {
  // ...
}

我知道裝飾器只能是函數,所以在其他一些文件中我計划有

export function RequireAuthentication() {
    if (!userService.isAuthenticated) {
        navigationService.goToLogin();
        return;
    }
}

我的問題是在這種情況下如何正確初始化 userService 和 navigationService,因為這些服務包含用於查找用戶是否通過身份驗證並顯示登錄屏幕的所有邏輯。

我已經嘗試過:

  1. 使用帶有構造函數的類進行服務初始化,但是嵌套方法不能用作裝飾器
  2. 要使用 Injectable 類創建服務,我需要創建此類的實例,同樣的問題。
  3. 使用 ModuleWithProviders 方法隱藏身份驗證實現並僅公開裝飾器,但不確定這是否是正確的方法。

任何提示都會有所幫助。 可能是因為我不是經驗豐富的 Angular 開發人員,所以我錯過了一些基本的東西,或者有另一種方法可以解決這個問題。

正如這個答案中所解釋的,框架慣用的解決方案是公開injector類實例屬性,因此可以在裝飾器內部訪問它。 injector屬性的存在也​​可以通過接口來保證。

由於屬性裝飾器運行一次並且可以訪問類原型但不能訪問實例,因此有必要修補ngOnOnit方法並使用this.injector.get()檢索修補方法中的所有必要服務。

另一種方法是全球注射器暴露一些對象,如解釋在這里 這不是慣用的解決方案,而是會導致某些限制和負面后果的黑客攻擊。 很難推薦在生產中使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM