首页 > 解决方案 > main.js Aurelia 中 setRoot 的依赖注入(用于 HttpFetch)

问题描述

我无法让依赖注入为我的 AuthorizerService 工作。显然,dep-inj 直到 Aurelia “启动”后才准备好,但我不确定如何访问它。

主.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())

还是有其他方法?

我可以删除“new AuthorizerService()”然后做吗(我编的):

aurelia.container.getInstance(AuthorizerService); 

不知何故强制它进行依赖注入并检索“http.c()”的“注册实例”?

我不能只检查cookie。为了安全起见,我必须 ping 服务器,服务器将设置 cookie。

我认为这是各种错误,因为我需要一个默认情况下为 false 的全局参数,然后它对后端服务器进行查询并相应地设置根。也许只在“登录页面”中查询后端?好的,但是我需要做“setRoot(backtoApp); aurelia.AlsoSetLoggedIn(true);” 登录模块内部。但是当我 setRoot(backtoApp) 时,它又重新开始了。

换句话说,当 setRoot(login); 然后 setRoot(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.log('Current State: %o', Authorizer.auth);
        aurelia.setRoot(root);
      });

授权者.js

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

“this.auth”不再是静态的。不再是“static auth = { isAuthenticated: false }”,这是我找到的一些示例代码。

所以现在“auth”被设置在“login”模块中。但这意味着每次应用程序短暂加载时都会显示“登录”模块,然后再重定向回“setRoot(backToApp)”

标签: aurelia

解决方案


如果你要获取实例的类是纯粹基于服务类的,并且对一些Aurelia插件没有依赖,则不需要等到Aurelia开始安全调用容器。

对于您的示例: aurelia.container.getInstance(AuthorizerService); 可以是 aurelia.container.get(AuthorizerService);

new AuthorizerService()正如您在问题中注意到的那样,您不应该使用。


推荐阅读