在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 ) } }
我试图通过this
和success
,然后调用t[success]()
的服务,但这会产生完全相同的错误.
我的服务使用断路器模式实现了客户端"负载均衡器",这就是我通过成功/失败功能尽可能多地重用我的代码的原因.
该服务使用rxjs
与toPromise
如
httpService(...).toPromise().then(success).catch(response => {(circuit breaker pattern on some failures)})
你需要绑定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)
)
}
可以将被设计用作回调的方法可以绑定到其定义的上下文中。这样,如果没有适当的上下文,就不可能偶然通过它们。
这可以通过箭头来实现:
success = (value: Response) : void => { ... }
或通过在构造函数中绑定方法:
constructor(...) { this.success = this.success.bind(this); ... }
第二种方式有一个优点,它允许将间谍/模拟方法设为AuthLoginComponent.prototype.success
。