前端(vue)入門到精通課程:進入學習
API 檔案、設計、偵錯、自動化測試一體化共同作業工具:
code repo github.com/rick-chou/a…
背景:我希望封裝一個自己的 message service 但是我不知道如何在 service 中使用 html 以下是我的一個解決方案
因為我使用的 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 是全域性共用 這兩個特性三 我們就可以寫出如下程式碼
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);
}
}
登入後複製
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);
}
}
登入後複製
登入後複製
更多程式設計相關知識,請存取:!!
以上就是如何在Angular service中使用TemplateRef的詳細內容,更多請關注TW511.COM其它相關文章!