Аурелия - Как мне зарегистрировать синглтон в дочернем контейнере маршрута? - PullRequest
2 голосов
/ 14 января 2020

Я бы хотел добавить один маршрут к маршруту, чтобы новый экземпляр создавался каждый раз, когда пользователь повторно входит в маршрут. Я думал, что смогу зарегистрировать экземпляр в (автоматически созданном) дочернем контейнере в модели представления маршрута, но я получаю ошибку:

ОШИБКА [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
  }
}

1 Ответ

1 голос
/ 14 января 2020

Бах, я нашел проблему! Сообщение об ошибке немного вводило меня в заблуждение.

Проблема заключалась в том, что Foo импортировал класс модели представления (потому что я прикрепил к нему постоянную c stati c). Этот класс модели представления еще не был инициализирован маршрутизатором. Я переместил константу в другой класс (в действительности он там не принадлежал), и ошибка исчезла.

Я также подтвердил, что синглтон Foo теперь ограничен дочерним контейнером маршрута.

...