我无法在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)”
答案 0 :(得分:1)
如果要获取实例的类完全基于服务类,并且不依赖于某些Aurelia插件,则无需等到Aurelia开始安全地调用容器。
例如: aurelia.container.getInstance(AuthorizerService); 有可能 aurelia.container.get(AuthorizerService);
并且您不应使用new AuthorizerService()
,就像您在问题中注意到的那样。