抱歉不知道如何说出这个问题。关键是,在重定向回应用程序时,重定向处理程序需要访问注入的UserManager
。
import { autoinject } from "aurelia-framework";
import { UserManager } from "oidc-client";
import { OpenIdConnectRouting } from "./open-id-connect-routing";
@autoinject
export class OpenIdConnect {
constructor(
private routerConfigurationService: OpenIdConnectRouting,
public UserManager: UserManager) { }
public Configure(routerConfiguration: RouterConfiguration) {
this.routerConfigurationService.ConfigureRouter(
routerConfiguration,
this.PostLogoutRedirectHandler);
}
public PostLogoutRedirectHandler = (): Promise<any> => {
return this.UserManager.signoutRedirectCallback(null);
}
}
上面的代码将PostLogoutRedirectHandler
传递给路由服务,这样当用户从授权服务器返回时,处理程序将会触发。
上面的代码可以工作,但处理程序只是lamda来捕获this
中的当前对象。当处理程序改为function
时,this
不是我们所期望的,我们无法访问注入的UserManager
对象。
为什么上面的代码适用于lambda而不是函数?使用lambda是一种合理的方法吗?如果没有,有没有办法用函数做到这一点?
编辑:
这是上述处理程序的函数/方法版本。
public PostLogoutRedirectHandler(): Promise<any> {
this.logger.Debug("PostLogoutRedirectHandler");
return this.UserManager.signoutRedirectCallback(null);
}
它会抛出以下错误:
无法读取未定义的属性“UserManager”
当然,使用lambda arrow function
可以正常工作。这个arrow function
是一种合理的模式还是一种反模式?它的成本是多少?
答案 0 :(得分:3)
你需要使用.bind(this)
传递this
对象作为外部执行函数,如回调或承诺:
function(){
//code what will be execute out from current object
}.bind(this)