无法使用 DI 注入 class
Unable to inject class with DI
我有一个 class,它使用来自“aurelia-dialog”的 DialogService
实例来打开我的 Aurelia 应用程序中的几乎每个对话框。以非常抽象的方式,class 看起来像这样:
export class DialogTrigger{
triggerDialogA() {...}
triggerDialogB() {...}
triggerDialogC() {...}
}
一切正常,直到我尝试将 DialogTrigger
注入其中一个对话框。
假设我想创建一个新对话框 DialogD。我只是在 DialogTrigger
中添加了另一种方法 triggerDialogD()
,它会打开一个带有 DialodD
视图模型的新对话框,一切正常。但是,如果我希望我的新对话框也通过使用 DialogTrigger
的实例来触发其他对话框之一(A、B 或 C),那么一切都会崩溃。
如果我将 DialogTrigger
注入 DialogD
我总是得到一个错误:
key/value cannot be null or undefined. Are you trying to inject/register something that doesn't exist with DI?
如果我删除依赖项,对话框会正常工作。
TL;DR
我有一个 DialogTrigger
class 打开 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 }); }
}
另一种选择是在 open()
函数的 model: {}
参数中传递对 DialogTrigger
的引用。像这样:
this._dialogService.open({ viewModel: './prompt', model: { dialogTrigger: this } });
我有一个 class,它使用来自“aurelia-dialog”的 DialogService
实例来打开我的 Aurelia 应用程序中的几乎每个对话框。以非常抽象的方式,class 看起来像这样:
export class DialogTrigger{
triggerDialogA() {...}
triggerDialogB() {...}
triggerDialogC() {...}
}
一切正常,直到我尝试将 DialogTrigger
注入其中一个对话框。
假设我想创建一个新对话框 DialogD。我只是在 DialogTrigger
中添加了另一种方法 triggerDialogD()
,它会打开一个带有 DialodD
视图模型的新对话框,一切正常。但是,如果我希望我的新对话框也通过使用 DialogTrigger
的实例来触发其他对话框之一(A、B 或 C),那么一切都会崩溃。
如果我将 DialogTrigger
注入 DialogD
我总是得到一个错误:
key/value cannot be null or undefined. Are you trying to inject/register something that doesn't exist with DI?
如果我删除依赖项,对话框会正常工作。
TL;DR
我有一个 DialogTrigger
class 打开 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 }); }
}
另一种选择是在 open()
函数的 model: {}
参数中传递对 DialogTrigger
的引用。像这样:
this._dialogService.open({ viewModel: './prompt', model: { dialogTrigger: this } });