我有一个类,它使用'aurelia dialog'中的DialogService
实例来打开我的aurelia应用程序中几乎所有的对话框。以一种非常抽象的方式,这个类如下所示:
export class DialogTrigger{
triggerDialogA() {...}
triggerDialogB() {...}
triggerDialogC() {...}
}
在我尝试将
DialogTrigger
注入其中一个对话框之前,一切正常。假设我想创建一个新对话框dialogd。我只需在
triggerDialogD()
中添加另一个方法DialogTrigger
,它将打开一个带有DialodD
视图模型的新对话框,并且一切正常。但是,如果我希望我的新对话框也通过使用DialogTrigger
的实例触发其他对话框(a、b或c),那么一切都会崩溃。如果我将
DialogTrigger
注入DialogD
中,总是会得到一个错误:键/值不能为空或未定义。你是否试图用DI注入/注册一些不存在的东西?
如果我删除依赖项,则对话框工作。
TL;博士
我有一个
DialogTrigger
类,它打开aurelia-dialog
s。当我将DialogTrigger
注入由它实例化的任何对话框时,di失败。有什么想法吗?
最佳答案
听起来像是循环依赖问题。
您必须使用路径字符串来引用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 } });