无法使用 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-dialogs。当我将 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 }  });