当前位置:  开发笔记 > 编程语言 > 正文

参考Angular2/Typescript中的回调

如何解决《参考Angular2/Typescript中的回调》经验,为你挑选了2个好方法。

在Angular2中传递实例方法.

login()在以下代码中从模板调用时,我收到此错误:

Failure TypeError: Cannot read property 'router' of null
    at AuthLoginComponent.success (auth-login.component.ts:30)
    at ZoneDelegate.invoke (zone.js:242)
    at Object.onInvoke (core.umd.js:4391)
    at ZoneDelegate.invoke (zone.js:241)
    at Zone.run (zone.js:113)
    at zone.js:520
    at ZoneDelegate.invokeTask (zone.js:275)
    at Object.onInvokeTask (core.umd.js:4382)
    at ZoneDelegate.invokeTask (zone.js:274)
    at Zone.runTask (zone.js:151)
    at drainMicroTaskQueue (zone.js:418)
    at XMLHttpRequest.ZoneTask.invoke (zone.js:349)

在以下代码中:

@Component({
    moduleId: module.id,
    selector: "app-auth-login",
    templateUrl: "/app/components/auth/login/auth-login.component.html"
})
export class AuthLoginComponent implements OnInit {
    username : "";
    password : "";

    constructor(
        private authLoginService: AuthLoginService,
        private router: Router
    ) {}

    ngOnInit(): void {
    }

    success(value: Response) : void {
        console.log("Success", value);
        this.router.navigate(["/home"]);
    }

    failure(value: Response) : void {
        console.log("Failure", value);
    }

    login() : void {
        this.authLoginService.login(
            this.username,
            this.password,
            this.success,
            this.failure
        )
    }
}

我试图通过thissuccess,然后调用t[success]()的服务,但这会产生完全相同的错误.

我的服务使用断路器模式实现了客户端"负载均衡器",这就是我通过成功/失败功能尽可能多地重用我的代码的原因.

该服务使用rxjstoPromisehttpService(...).toPromise().then(success).catch(response => {(circuit breaker pattern on some failures)})



1> Günter Zöchb..:

你需要绑定this,否则this在回调中将指向调用者.

login() : void {
    this.authLoginService.login(
        this.username,
        this.password,
        this.success.bind(this),
        this.failure.bind(this)
    )
}

另一种方法是使用箭头功能

login() : void {
    this.authLoginService.login(
        this.username,
        this.password,
        (value) => this.success(value), 
        (value) => this.failure(value)
    )
}



2> Estus Flask..:

可以将被设计用作回调的方法可以绑定到其定义的上下文中。这样,如果没有适当的上下文,就不可能偶然通过它们。

这可以通过箭头来实现:

success = (value: Response) : void => { ... }

或通过在构造函数中绑定方法:

constructor(...) {
  this.success = this.success.bind(this);
  ...
}

第二种方式有一个优点,它允许将间谍/模拟方法设为AuthLoginComponent.prototype.success

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有