我有一个类使用来自' aurelia-dialog`的DialogService
实例来打开我Aurelia应用程序中的几乎每个对话框。以非常抽象的方式,类看起来像这样:
export class DialogTrigger{
triggerDialogA() {...}
triggerDialogB() {...}
triggerDialogC() {...}
}
一切正常,直到我尝试将DialogTrigger
注入其中一个对话框。
所以,让我们说我想创建一个新的对话框DialogD。我只需在triggerDialogD()
中添加另一个方法DialogTrigger
即可打开一个带有DialodD
视图模型的新对话框,一切正常。但是如果我希望我的新对话框也通过使用DialogTrigger
的实例触发其他对话框(A,B或C)之一,那么一切都会崩溃。
如果我将DialogTrigger
注入DialogD
,我总会收到错误:
键/值不能为null或未定义。您是否尝试注入/注册DI不存在的东西?
如果删除依赖项,则对话框有效。
TL; DR
我有一个DialogTrigger
课程,可以打开aurelia-dialog
个。当我将DialogTrigger
注入由它实例化的任何对话框时,DI失败。
有什么想法吗?
答案 0 :(得分:5)
听起来像循环依赖问题。
您必须使用路径字符串来引用DialogTrigger
中的对话框。您无法将Dialog
导入DialogTrigger
,然后将DialogTrigger
导入Dialog
。
这样可行:
import { DialogService } from 'aurelia-dialog';
export class DialogTrigger {
static inject = [DialogService];
constructor(dialogService) {
this._dialogService = dialogService;
}
openDialogA() { this._dialogService.open({ viewModel: './prompt' }); }
openDialogB() { this._dialogService.open({ viewModel: './prompt' }); }
}
不会工作:
import { DialogService } from 'aurelia-dialog';
import { Prompt } from './prompt';
export class DialogTrigger {
static inject = [DialogService];
constructor(dialogService) {
this._dialogService = dialogService;
}
openDialogA() { this._dialogService.open({ viewModel: Prompt }); }
openDialogB() { this._dialogService.open({ viewModel: Prompt }); }
}
另一种选择是将引用传递给DialogTrigger
函数的open()
参数中的model: {}
。像这样:
this._dialogService.open({ viewModel: './prompt', model: { dialogTrigger: this } });