访问我们传递给另一个对象的函数内的注入依赖项

时间:2016-09-24 16:51:35

标签: javascript typescript lambda dependency-injection aurelia

抱歉不知道如何说出这个问题。关键是,在重定向回应用程序时,重定向处理程序需要访问注入的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是一种合理的模式还是一种反模式?它的成本是多少?

1 个答案:

答案 0 :(得分:3)

你需要使用.bind(this)传递this对象作为外部执行函数,如回调或承诺:

function(){
  //code what will be execute out from current object
}.bind(this)