如何为整个应用程序编写一次离子警报组件?

How do I write an ionic alert component once for the entire application?

这是一道设计题。我(还)没有破坏代码。 ;-)

我有一个连接了多个模块的 ionic/angular 应用程序。在整个使用过程中,用户经常从 page-to-page/module 移动到模块。

我系统的另一部分将新元素放入 Firestore 数据库以响应外部事件。每当 Firestore 数据库中出现新条目时,我都想在屏幕上生成一条新消息,而不管当前向用户显示的是哪个 module/page..

根据我的研究,我似乎必须创建一个警报或弹出窗口或覆盖组件,然后将该组件包含在每个模块中并将其放置在每个模板文件中,以便显示消息。似乎没有办法编写一个覆盖组件,只要有适当的触发器,它就会将自己推到正在显示的任何其他内容上。

有没有办法在应用程序级别实现一次 overlay/alert/popover 而无需编写代码来处理每个模块中的潜在 overlay/popover/alert?

--保罗

可以将小吃店作为一项服务来使用。配置模态的样式,为模态传递数据(自定义消息等)。 https://material.angular.io/components/snack-bar/examples

MatSnackBar 是一个 angular 指令,专门用于在移动设备上显示通知栏。 这些类型的 UI 组件通常会被多次使用。 所以为了避免重复代码,可以简单地创建一个服务,在不同的组件中使用SnackBar。

要创建服务,您必须使用以下命令: ng g s 小吃吧 现在从@angular/core 导入 MatSnackBar 并定义函数 openSnackBar(您始终可以使用不同的名称)。

服务

import { Injectable } from '@angular/core';
import {MatSnackBar} from '@angular/material/snack-bar';

@Injectable({
  providedIn: 'root'
})
export class SnackBarService {
  
//create an instance of MatSnackBar
  
  constructor(private snackBar:MatSnackBar) { }
  
/* It takes three parameters 
    1.the message string 
    2.the action 
    3.the duration, alignment, etc. */
  
  openSnackBar(message: string, action: string) {
    this.snackBar.open(message, action, {
       duration: 2000,
    });
  }
}

导入 snackBarService 并将其注入到要使用 Snackbar 的组件的构造函数中。这将创建一个服务实例,比如 snackBService。 现在在 snackBService 的帮助下,在任何需要的地方调用 openSnackBar 函数。

组件

import { Component, OnInit } from '@angular/core';
import {SnackBarService} from '../snack.service';
  
  
@Component({
  selector: 'app-profile',
  templateUrl: './snackBar.html',
  styleUrls: ['./snackBar.css']
})
export class SnackBar {
  
  // create an instance of SnackBarService 
  
  constructor(private snackBService:SnackBarService) { }
  
  //defining method for display of SnackBar
  
  trigger(message:string, action:string)
  {
   this.snackBService.openSnackBar(message, action);
  }
  
}

通过重复这些步骤,我们可以在任何组件中使用 snackBar。 示例:

<button (click)="trigger('This is a ', 'SnackBar')">
    SnackBarButton
</button>