Внедрение зависимостей (для HttpFetch) в setRoot в main.js Aurelia - PullRequest
1 голос
/ 17 апреля 2019

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

main.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.log('Current State: %o', Authorizer.auth);
    Authorizer.checkCookieAndPingServer().then(() => { console.log('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())

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

Могу ли я удалить «новый AuthorizerService ()» и просто сделать (я сделал это):

aurelia.container.getInstance(AuthorizerService); 

Каким-то образом заставить его выполнить внедрение зависимостей и получить "зарегистрированный экземпляр" функции http.c () "?

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

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

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

РЕДАКТИРОВАТЬ: Лучшее решение может быть:

main.js:

return aurelia.start().then(() => {
        let Authorizer = aurelia.container.get(AuthorizerService);
        let root = Authorizer.isAuthenticated() ? PLATFORM.moduleName('app') : PLATFORM.moduleName('login');
        console.log('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)»

1 Ответ

1 голос
/ 18 апреля 2019

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

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

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

...