我正在开发一个Angular 应用程序,其中我使用来自Ng-Zorro Ant Design的NzMessageService来显示消息.我正在try 将一个动态TemplateRef传递给NzMessageService,但面临一些挑战.

以下是代码的简化版本:

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

@Injectable({
  providedIn: 'root',
})
export class DynamicMessageService {
  constructor(private messageService: NzMessageService) {}

  showMessage(dynamicText: string | TemplateRef<void>): void {
    // I'm trying to create a dynamic component or view and pass it to NzMessageService
    
    this.messageService.create('error', /* ??? */, { nzDuration: 80000 });
  }
}

DynamicText可以是字符串或TemplateRef.我曾try 创建动态组件或视图,但遇到了类型不匹配的问题.

有没有人能在Angular 上提供最佳实现方法的指导?

推荐答案

更新

如果你只是想配置模板,创建一个单独的组件,它将包含模板,如果你想要不同的模板,只需创建更多的模板引用和单独的方法来打开消息.

包含所有模板的消息容器

import { Component, OnInit, ViewChild, TemplateRef } from '@angular/core';
import { NzMessageDataOptions, NzMessageService } from 'ng-zorro-antd/message';
import { MessageService } from '../message-service.service';
import { CustomComponentShowInsideMessageComponent } from './custom-component-show-inside-message/custom-component-show-inside-message.component';

@Component({
  selector: 'app-custom-message',
  template: `
  <ng-template #template>
    <app-custom-component-show-inside-message/>
  </ng-template>
  `,
  imports: [CustomComponentShowInsideMessageComponent],
  standalone: true,
})
export class CustomMessageComponent {
  @ViewChild('template') template!: TemplateRef<void>;

  constructor(private message: MessageService) {}

  ngAfterViewInit() {
    debugger;
    this.message.template = this.template;
  }
}

消息服务

import { Injectable, TemplateRef } from '@angular/core';
import { NzMessageDataOptions, NzMessageService } from 'ng-zorro-antd/message';

@Injectable({
  providedIn: 'root',
})
export class MessageService {
  template!: TemplateRef<void>;

  constructor(private message: NzMessageService) {}

  open(
    type: 'success' | 'info' | 'warning' | 'error' | 'loading' | string,
    customTemplate: TemplateRef<void> = null,
    options: NzMessageDataOptions = null
  ): void {
    this.message.create(type, customTemplate || this.template, options);
  }
}

app组件

import { Component } from '@angular/core';

import { MessageService } from './message-service.service';

@Component({
  selector: 'nz-demo-message-info',
  template: ` 
  <button nz-button [nzType]="'primary'" (click)="createBasicMessage()">Display normal message</button> 
  <app-custom-message/>
  `,
})
export class NzDemoMessageInfoComponent {
  constructor(private message: MessageService) {}

  createBasicMessage() {
    this.message.open('error', null, { nzDuration: 80000 });
  }
}

stackblitz

Html相关问答推荐

角|将动态html属性添加到子组件

子元素以元素X开始和结束的元素的XPath?

如何最大限度地减少Cookie同意代码对性能的影响?

仅在加载视频时显示描述(<;Video>;标签)

调整一组IMG的大小以适应容器DIV

单独处理Button:Focus的多行按钮

try 更新我的Node.js应用程序中的用户,但我收到错误.然而,当我使用postman 时,更新工作正常

如何解决水平塌陷问题?

太多的 Web 视图实例导致手机过热 Swift

如何使用 Tailwind CSS 分隔导航栏中的元素?

是否可以制作响应式 CSS 剪辑路径?

无法在 CSS 中将 h1 标签居中

如何影响 HTML 元素的哪些子元素导致其增长,哪些不增长?

如何为Vuetify输入控件减小标签和字段之间的间距?

使用HTML和CSS构建简历网站.无法使body元素内的div元素跨越整个网站高度

导航丸被选中(活动),但内容未显示.怎么会?

如何将图像移动到父容器的右侧?

父背景仅在子元素中可见

圆形边框显示在该部分后面.怎么修?

另一个 flex 元素之间的 CSS 空间