如何在Angular service中使用TemplateRef

2022-10-08 22:00:14

前端(vue)入門到精通課程:進入學習
API 檔案、設計、偵錯、自動化測試一體化共同作業工具:


code repo github.com/rick-chou/a…

背景:我希望封裝一個自己的 message service 但是我不知道如何在 service 中使用 html 以下是我的一個解決方案

1.png

因為我使用的 NG-ZORRO 的 Notification 元件來做 UI 層。【相關教學推薦:《》】

https://ng.ant.design/components/notification/en

NzNotificationService.template 簽名如下

template(template: TemplateRef<{}>, options?: NzNotificationDataOptions): NzNotificationRef;
登入後複製

所以我需要自定義的 TemplateRef 來滿足我的需求

思路一

可以在 service 中定義方法 從業務元件中傳入 但是這樣和直接在業務中使用 NzNotificationService.template 沒有什麼區別 也就沒有集中處理的必要了

思路二

給 service 注入 html template

既然不能直接在 service 中書寫 html 相關程式碼 那就沿用思路一的方法

只不過事先在一處與業務無關的地方呼叫初始化的方法

利用 ng-template 不會生成真實的 dom 節點 以及 service 是全域性共用 這兩個特性三 我們就可以寫出如下程式碼

message.service.ts

import { Injectable, TemplateRef } from '@angular/core';
import { NzNotificationService } from 'ng-zorro-antd/notification';

export enum EMessageCode {
  XXXError = 1024,
  YYYError = 1025,
}

export const MESSAGE = {
  [EMessageCode.XXXError]: 'XXXError...',
  [EMessageCode.YYYError]: 'YYYError...',
};

@Injectable({
  providedIn: 'root',
})
export class MessageService {
  private templateMap = new Map>();
  constructor(private notificationService: NzNotificationService) {}

  // 初始化 templateRef
  public initTemplate(message: EMessageCode, ref: TemplateRef): void {
    this.templateMap.set(message, ref);
  }

  public showMessage(messageCode: EMessageCode) {
    switch (messageCode) {
      case EMessageCode.XXXError:
        return this.notificationService.template(>this.templateMap.get(messageCode), {
          nzDuration: 0,
        });
      case EMessageCode.YYYError: {
        return this.notificationService.error('YYYError', MESSAGE[EMessageCode.YYYError]);
      }
    }
  }

  public removeMessage(messageId?: string) {
    this.notificationService.remove(messageId);
  }
}
登入後複製

message-service-virtual-ref.component

import { Component, TemplateRef, ViewChild, AfterViewInit } from '@angular/core';
import { EMessageCode, MessageService } from './message.service';

@Component({
  selector: 'app-message-service-virtual-ref',
  template: `
    
      
There are XXXError, you must refer to something to check out
`, }) export class MessageServiceVirtualRefComponent implements AfterViewInit { @ViewChild('xxx_ref') xxxTemplateRef!: TemplateRef; constructor(private messageService: MessageService) {} ngAfterViewInit(): void { this.messageService.initTemplate(EMessageCode.XXXError, this.xxxTemplateRef); } }
登入後複製

app.component.html

 
登入後複製

更多程式設計相關知識,請存取:!!

以上就是如何在Angular service中使用TemplateRef的詳細內容,更多請關注TW511.COM其它相關文章!