首页 > 解决方案 > Aurelia - 如何在路线的子容器中注册单例?

问题描述

我想将单例限定为路由,以便每次用户重新进入路由时都会创建一个新实例。我以为我可以在路由视图模型中的(自动创建的)子容器上注册一个实例,但出现错误:

错误 [app-router] ReferenceError:在初始化之前无法访问“SomeOtherClass”

如何在路由的容器中注册单例,使其仅适用于该路由?

我的路由虚拟机看起来像

import {autoinject, Container} from 'aurelia-framework';
import {SomeOtherClass} from '...some-other-class'; // The actual relative path

@autoinject
export class SomeRoute {

  constructor(private container: Container) {
    container.registerInstance(SomeOtherClass);
  }
}

我要注册的类会自动注入到路由中的各个组件中。那堂课看起来像

import {autoinject} from 'aurelia-framework';

@autoinject
export class SomeOtherClass {

  constructor(private dep1: Dep1, private dep2: Dep2) {
    // Stuff that I want to re-run every time the user (re)enters the route
  }
}

和其他类只是像这样注入它

import {autoinject} from 'aurelia-framework';
import {SomeOtherClass} from '...some-other-class'; // The actual relative path

@autoinject
export class SomeComponent {

  constructor(someOtherClass: SomeOtherClass) {
    // Use the singleton instance within this route
  }
}

标签: javascripttypescriptdependency-injectionaurelia

解决方案


呸,我发现问题了!错误消息对我来说有点误导。

问题是Foo导入了一个视图模型类(因为我在它上面贴了一个公共静态常量)。路由器尚未初始化该视图模型类。我将常量移到另一个类(无论如何都不属于那里)并且错误消失了。

我还确认Foo's 单例现在被限定为路由的子容器。


推荐阅读