main.js Aurelia 中 setRoot 的依赖注入(用于 HttpFetch)
Dependency Injection (for HttpFetch) at setRoot in main.js Aurelia
我无法让依赖注入为我的 AuthorizerService 工作。显然,dep-inj 直到 Aurelia "starts" 之后才准备就绪,但我不确定如何访问它。
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())
或者有其他方法吗?
我可以删除 "new AuthorizerService()" 然后就这样做吗(我编的):
aurelia.container.getInstance(AuthorizerService);
以某种方式强制它进行依赖注入并检索 "http.c()" 的 "registered Instance"?
我不能只检查 cookie。为了安全起见,我必须 ping 服务器,服务器将设置 cookie。
我认为这完全是错误的,因为我需要一个默认为 false 的全局参数,然后它会查询后端服务器并相应地设置 Root。也许只在 "login page" 查询后端?好的,但是我需要在登录模块中执行 "setRoot(backtoApp); aurelia.AlsoSetLoggedIn(true);" 。但是当我 setRoot(backtoApp) 然后它又重新开始了。
也就是说,当setRoot(login);然后 setRoot(backToApp); <-- 那么 AuthorizerService 实例没有其正确的数据集(例如 loggedIn=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" 不再是静态的。不再 "static auth = { isAuthenticated: false }" 这是我找到的一些示例代码。
所以现在 "auth" 设置在 "login" 模块中。但这意味着每次应用程序短暂加载时都会显示 "login" 模块,然后再重定向回 "setRoot(backToApp)"
如果你要获取的class实例是纯粹基于classes的服务,对某些Aurelia插件没有依赖,则不需要等到Aurelia已经启动安全调用容器。
以你的例子为例:
aurelia.container.getInstance(AuthorizerService);
有可能
aurelia.container.get(AuthorizerService);
并且您不应该使用 new AuthorizerService()
,正如您在问题中注意到的那样。
我无法让依赖注入为我的 AuthorizerService 工作。显然,dep-inj 直到 Aurelia "starts" 之后才准备就绪,但我不确定如何访问它。
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())
或者有其他方法吗?
我可以删除 "new AuthorizerService()" 然后就这样做吗(我编的):
aurelia.container.getInstance(AuthorizerService);
以某种方式强制它进行依赖注入并检索 "http.c()" 的 "registered Instance"?
我不能只检查 cookie。为了安全起见,我必须 ping 服务器,服务器将设置 cookie。
我认为这完全是错误的,因为我需要一个默认为 false 的全局参数,然后它会查询后端服务器并相应地设置 Root。也许只在 "login page" 查询后端?好的,但是我需要在登录模块中执行 "setRoot(backtoApp); aurelia.AlsoSetLoggedIn(true);" 。但是当我 setRoot(backtoApp) 然后它又重新开始了。
也就是说,当setRoot(login);然后 setRoot(backToApp); <-- 那么 AuthorizerService 实例没有其正确的数据集(例如 loggedIn=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" 不再是静态的。不再 "static auth = { isAuthenticated: false }" 这是我找到的一些示例代码。
所以现在 "auth" 设置在 "login" 模块中。但这意味着每次应用程序短暂加载时都会显示 "login" 模块,然后再重定向回 "setRoot(backToApp)"
如果你要获取的class实例是纯粹基于classes的服务,对某些Aurelia插件没有依赖,则不需要等到Aurelia已经启动安全调用容器。
以你的例子为例: aurelia.container.getInstance(AuthorizerService); 有可能 aurelia.container.get(AuthorizerService);
并且您不应该使用 new AuthorizerService()
,正如您在问题中注意到的那样。