无法用DI注入课程

dim*_*cas 4 dependency-injection typescript aurelia aurelia-dialog

我有一个类使用DialogService来自'aurelia-dialog` 的实例来打开我的Aurelia应用程序中的几乎每个对话框.以非常抽象的方式,类看起来像这样:

export class DialogTrigger{
    triggerDialogA() {...}
    triggerDialogB() {...}
    triggerDialogC() {...}
}
Run Code Online (Sandbox Code Playgroud)

一切正常,直到我尝试注入DialogTrigger其中一个对话框.

所以我想说我想创建一个新的对话框DialogD.我只需添加另一种方法triggerDialogD()DialogTrigger打开一个新的对话框DialodD视图模型和一切正常.但是,如果我希望我的新对话框也可以通过使用DialogTrigger一切实例来触发其他对话框(A,B或C)之一.

如果我注入DialogTriggerDialogD我总是得到一个错误:

键/值不能为null或未定义.您是否尝试注入/注册DI不存在的内容?

如果我删除依赖项,该对话框将起作用.

TL; DR 我有一个DialogTrigger打开aurelia-dialogs 的课程.当我注入DialogTrigger由它实例化的任何对话框时,DI失败.

有任何想法吗?

Tra*_*avo 6

听起来像循环依赖问题.

您必须使用路径字符串来引用其中的对话框DialogTrigger.你不能导入DialogDialogTrigger,然后也输入DialogTriggerDialog.


这可行:

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' }); }
}
Run Code Online (Sandbox Code Playgroud)

不会起作用:

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 }); }
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是将引用传递给DialogTriggeropen()函数的model: {}参数.像这样:

this._dialogService.open({ viewModel: './prompt', model: { dialogTrigger: this }  });
Run Code Online (Sandbox Code Playgroud)