【问题标题】:Unable to inject class with DI无法使用 DI 注入类
【发布时间】:2017-06-27 08:44:46
【问题描述】:

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

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

在我尝试将DialogTrigger 注入其中一个对话框之前,一切正常。

假设我想创建一个新对话框 DialogD。我只是在DialogTrigger 中添加另一个方法triggerDialogD(),它会打开一个带有DialodD 视图模型的新对话框,一切正常。但是,如果我希望我的新对话框也通过使用 DialogTrigger 的实例来触发其他对话框之一(A、B 或 C),那么一切都会崩溃。

如果我将DialogTrigger 注入DialogD,我总是会收到错误消息:

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

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

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

有什么想法吗?

【问题讨论】:

    标签: typescript dependency-injection aurelia aurelia-dialog


    【解决方案1】:

    听起来像是循环依赖问题。

    您必须使用路径字符串来引用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 }  });
    

    【讨论】:

      猜你喜欢
      • 2019-10-22
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多