我有一个类,它使用'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-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 }); }
}

另一种选择是将引用引用到DialogTrigger函数open()参数中的model: {}。就像这样:
this._dialogService.open({ viewModel: './prompt', model: { dialogTrigger: this }  });

09-25 15:38