angular - 具有 Primeng 动态对话框的多个服务相互干扰
问题描述
我正在努力解决 angular/primeng 问题。我在不同的模块中有两个服务,每个模块都使用 DialogService 创建一个 DynamicDialog 组件。
我已经读过,如果您同时有多个模式,您需要单独的 DialogService 实例。我试图通过将每个服务放在它们自己的模块中并将 DialogService 放在每个模块的“提供者”部分来实现这一点。
每个模态本身都可以正常工作,但是我遇到了两个模态同时显示的情况。在这种情况下,在我关闭第二个模式后,我无法关闭第一个模式,即使关闭代码被触发并返回结果。
这个问题的一个例子的 stackblitz 是:
https://stackblitz.com/github/thomasesh/twomodalproblem
任何帮助将不胜感激。
解决方案
原因是角度DI。你在 app-module 中导入了 module-a 和 module-b。他们都提供DialogService。并且由于 DI 的工作方式,创建了服务的 SINGLE 实例。这是 imo primeng 错误,但要解决它,您可以创建一个令牌并使用令牌提供(并注入)服务的第二个实例,而不是使用相同的服务实例
// token.ts
export const DialogServiceToken = new InjectionToken('DialogService');
//module-b.ts
providers: [
{ provide: DialogServiceToken, useClass: DialogService} // this will register second instance of DialogService
]
//module-b.service
constructor( @Inject(dialogServiceToken) private dialogService: DialogService) {} // here we inject the second instance of a service
推荐阅读
- json - Django Rest API 更新实例问题
- python - 根据列表顺序重新排列列,然后将列表映射为新列
- ios - 数组要求 'Element' 符合 'Equatable'
- node.js - 如何将循环内的请求响应分配给节点中的数组
- ruby-on-rails - 从数据库中获取每 n 条记录 - Ruby on Rails
- javascript - 将 json 对象的索引映射到数组
- ios - iOS - superView 的相对顶部空间
- json - 使用哪种结构来解析 JSON 中的数据?
- javascript - 如何在 Angular 中调整 mat-header-cell 宽度?
- node.js - 我如何在 Laravel (5.*) 中使用普通的 SQL 查询?或者我应该学习 ORM 吗?