aurelia - 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.container.getInstance(AuthorizerService); 可以是 aurelia.container.get(AuthorizerService);
new AuthorizerService()
正如您在问题中注意到的那样,您不应该使用。
推荐阅读
- angular - 从服务访问组件数据
- python - 如何匹配被特殊字母和/或括号包围的字符?
- python - 我在 python 应用程序中使用的 celery.scheduler 不起作用
- php - Laravel,与 Pivot 同步数据
- node.js - 如何获取 child.stdin 的 fd?
- r - 有没有办法在基于多列的单独列中获取一系列月份值?
- android - 编译时未解决的参考,但 Intellisense 可用
- objective-c - 运行时警告 CLSUserDefaults 实现了两次
- javascript - 使用反应钩子禁用相邻的选项卡
- pivottable.js - PivotTable.JS 回调实现问题