main.js Aurelia中setRoot的依赖项注入(用于HttpFetch)

时间:2019-04-16 21:53:31

标签: aurelia aurelia-framework

我无法在AuthorizerService上进行依赖项注入。显然,直到Aurelia“启动”之后,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()”,那么AuthorizerService.js中将不提供“ this.http.fetch()”。

我是要传递“ http.c()”(传递HttpClient实例)作为内部参数:

checkCookieAndPingServer(http.c())

还是还有另一种方法?

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

aurelia.container.getInstance(AuthorizerService); 

以某种方式强制执行依赖项注入并检索“ http.c()”的“注册实例”吗?

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

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

换句话说,当setRoot(login);然后setRoot(backToApp); <-则AuthorizerService实例没有正确的数据集(例如loggingIn = true)。

编辑:更好的解决方案可能是:

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”不再是静态的。不再是“静态auth = {isAuthenticated:false}”,这是我发现的一些示例代码。

因此,现在在“登录”模块中设置了“身份验证”。但这意味着应用程序每次短暂加载都会显示“登录”模块,然后重定向到“ setRoot(backToApp)”

1 个答案:

答案 0 :(得分:1)

如果要获取实例的类完全基于服务类,并且不依赖于某些Aurelia插件,则无需等到Aurelia开始安全地调用容器。

例如:     aurelia.container.getInstance(AuthorizerService); 有可能     aurelia.container.get(AuthorizerService);

并且您不应使用new AuthorizerService(),就像您在问题中注意到的那样。