4

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

export class DialogTrigger{
    triggerDialogA() {...}
    triggerDialogB() {...}
    triggerDialogC() {...}
}

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

因此,假设我要创建一个新对话框 DialogD。我只是添加了另一种方法triggerDialogD()DialogTrigger该方法会打开一个带有DialodD视图模型的新对话框,一切正常。但是,如果我希望我的新对话框也可以通过使用所有内容的实例来触发其他对话框之一(A、B 或 C)DialogTrigger

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

键/值不能为空或未定义。您是否尝试注入/注册 DI 不存在的东西?

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

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

有任何想法吗?

4

1 回答 1

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' }); }
}

不起作用:

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 }  });
于 2017-02-09T11:25:19.047 回答