Внедрение зависимостей (для HttpFetch) в setRoot в main.js Aurelia

У меня возникли проблемы с внедрением зависимостей для моего AuthorizerService. Очевидно, что dep-inj не будет готов до тех пор, пока Аурелия не «запустится», но я не знал, как получить к нему доступ.

основной.js:

  aurelia.container.registerInstance(HttpClient, http.c());
  // set your interceptors to take cookie data and put into header
  return aurelia.start().then(() => {
    let Authorizer = new AuthorizerService();
    aurelia.container.registerInstance(AuthorizerService, Authorization);
    console.info('Current State: %o', Authorizer.auth);
    Authorizer.checkCookieAndPingServer().then(() => { console.info('Current State: %o', Authorizer.auth); aurelia.setRoot(PLATFORM.moduleName('app'));  }, () => { aurelia.setRoot(PLATFORM.moduleName('login-redirect')); });
  });

Теперь проблема в том, что если я делаю "new AuthorizerService()", то "this.http.fetch()" недоступен в AuthorizerService.js.

Я хотел передать "http.c()" (который доставляет экземпляр HttpClient) в качестве параметра внутри:

checkCookieAndPingServer(http.c())

или есть другой способ?

Могу ли я удалить «new AuthorizerService()» и просто сделать (я это придумал):

aurelia.container.getInstance(AuthorizerService); 

Каким-то образом ЗАСТАВИТЬ это сделать внедрение зависимостей и получить «зарегистрированный экземпляр» «http.c ()»?

Я не могу просто проверить куки. Мне нужно пропинговать сервер для обеспечения безопасности, и сервер установит файл cookie.

Я думаю, что это неправильно, потому что мне нужен глобальный параметр, который по умолчанию равен false, затем он выполняет запрос к внутреннему серверу и соответственно устанавливает Root. Возможно, только бэкэнд запроса на «странице входа»? Хорошо, но тогда мне нужно будет сделать "setRoot(backtoApp); aurelia.AlsoSetLoggedIn(true);" внутри модуля входа. Но когда я устанавливаю Root (backtoApp), то все начинается сначала.

Другими словами, когда setRoot(login); затем установитьRoot(backToApp); <-- тогда экземпляр AuthorizerService не имеет надлежащего набора данных (например, loggedIn=true).

Обновлено: Возможно, лучшее решение:

основной.js:

return aurelia.start().then(() => {
        let Authorizer = aurelia.container.get(AuthorizerService);
        let root = Authorizer.isAuthenticated() ? PLATFORM.moduleName('app') : PLATFORM.moduleName('login');
        console.info('Current State: %o', Authorizer.auth);
        aurelia.setRoot(root);
      });

Authorizer.js

constructor(http) {
    this.http = http;
    this.auth = {
      isAuthenticated: false,
      user: {}
    }
  }

«this.auth» больше не является статичным. Больше не "static auth = {isAuthenticated: false}", который был примером кода, который я нашел.

Итак, теперь «auth» устанавливается внутри модуля «login». Но это означает, что модуль «логин» отображается каждый раз, когда приложение ненадолго загружается, прежде чем его перенаправят обратно в «setRoot (backToApp)».

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если класс, который вы хотите получить, основан исключительно на классах обслуживания и не имеет зависимостей от некоторых подключаемых модулей Aurelia, ему не нужно ждать, пока Aurelia начнет безопасно вызывать контейнер.

Для вашего примера: aurelia.container.getInstance(AuthorizerService); Это может быть aurelia.container.get(AuthorizerService);

И вы не должны использовать new AuthorizerService(), как вы заметили в своем вопросе.

Да, похоже, теперь все работает с «Обновлено: лучшее решение», которое я написал выше. Это кажется лучшим способом не сломать инъекцию зависимостей.

Dexter 30.04.2019 21:22

Другие вопросы по теме