以下是我的html示例:

<p-toast key="key1" position="bottom-right" [preventOpenDuplicates]="true"></p-toast>
<p-toast key="key2" position="bottom-right" [preventOpenDuplicates]="true"></p-toast>

每个祝wine 词指的是特定类型的系统通知,因此可以有 Select 地只清除一个通知以及所有通知.

但在我的组件中,如果我通过以下命令触发上述所有键:

this.messageService.add({key: 'key1',severity: 'error',summary: 'Notification',detail: 'Detail Err',life: 2000,sticky: true});
this.messageService.add({key: 'key2',severity: 'warn',summary: 'Notification',detail: 'Detail Warning !!!',life: 2000,sticky: true});

结果将由两个重叠的祝wine 词组成:

enter image description here

最后,我们转到主要问题:是否可以堆叠上面的 cogo toast ,就像它们有一些键一样,没有键的toast html标记的行为如下:

enter image description here

当然,保留了 Select 性地关闭所需 cogo toast 的能力.

Fiddle here

提前谢谢你

推荐答案

是的,你可以,但不能用这种方法,所以读到最后.

在我看来,第一个关于不同 cogo toast 组件重叠的问题是不可能实现的,因为它们是独立的组件,不知道toast组件的任何其他实例发生了什么.

因此,给出第一个语句,我们必须将所有 cogo toast 放在单个toast cmp实例中(例如,不要使用相同的键)

这里有第二个问题,关于 cogo toast 的差异清除,如primeNg文档中所示,该库提供了一个选项,可以清除所有工具提示,或清除某些工具提示组件中的所有工具提示(基于键).这不是我们想要的结果.有关支持哪些清算的更多信息,您可以查看文档toast docs here.

现在是解决办法的时候了.

如果我们转到这里primeNG toast source,我们可以看到所有消息(例如可见的祝wine 词)都存储在变量messages中名为Toast的组件中.因此,我清除特定消息的方法是将Toast组件与ViewChild组件一起处理,如下所示:

export class AppComponent {
   @ViewChild(Toast) toast: Toast;

  clear(type: string) {
    this.toast.messages = this.toast.messages.filter(
      (x) => x.severity !== type
    );
  }
}

因此,每当我点击某个明确的type通知按钮时,我就会从祝wine 词中清除该消息的所有实例.

现在应该都可以工作了,但实际上,所有第三方组件库通常都使用OnPush更改检测策略,所以我们必须采取额外的操作.我们必须触发Toast的更改检测,并最终得到以下解决方案

export class AppComponent {
  @ViewChild(Toast) toast: Toast;
  @ViewChild(Toast, { read: ViewContainerRef, static: true })
 ...
 clear(type: string) {
    this.toast.messages = this.toast.messages.filter(
      (x) => x.severity !== type
    );
    const changeDetectorRef = this.toastRef.injector.get(ChangeDetectorRef);
    changeDetectorRef.detectChanges();
  }
}

有关CDR和这里使用的技术的更多信息,您可以查看以下文章:Forcing change detection on third-party Angular components

工作stackblitz

备注: 从Toast组件发出的关闭事件可能会有一些有趣的东西,但我相信它们不会引起任何问题.

Angular相关问答推荐

Angular material 输入字段中的图标未显示

升级到angular 17并转换为独立的加载器拦截器后,

角部炎问题

独立组件;依赖项注入

Angular 16:CSRF配置:我仍然可以使用HttpXsrfInterceptor和HttpXsrfCookieExtractor类吗?Inteli-J说他们不存在

在Angular 为17的独立零部件中使用@NGX-平移

P-DropDown不会使用react 式表单手动设置Value

错误TS2531:对象可能为空.论窗体数组控件

多个 Mat Paginator 在 Angular 组件中不起作用

Subject.complete() 是否取消订阅所有听众?

在Angular 4中有条件地应用点击事件

无法读取 angular2 中未定义(…)的属性 push

Angular 4 - 在下拉列表中 Select 默认值 [Reactive Forms]

Angular2 Pipes:输出原始 HTML

Angular 2中基于Condition条件的点击事件

如何在 Angular 2 中创建可重用的动画

错误:angular2 中没有 HttpHandler 的提供者

Angular2延迟加载模块错误'找不到模块'

包 '@angular/cli' 不是依赖项

如何使用formControlName和处理嵌套的formGroup?