我正在学习Angular2,遵循Angular.io上的“英雄之旅”教程。在本教程结束时,我们将路由设置到详细信息页面并传递指示要移位的英雄的参数。这是使用ActivatedRoute中的params Observable处理的。我们使用switchMap从params Observable重定向到Promise,根据参数返回我们想要的数据。
本教程中使用的语法简洁,因此我尝试将其分解为构建块,以便更好地了解正在发生的事情。具体来说,我试图用实际函数替换右箭头符号,我认为这是相同的。但我的修改不起作用。
以下是代码:
ngOnInit(): void {
this.route.params
.switchMap((params: Params) => this.heroService.getHero(+params['id']))
//.switchMap(this.getHero)
.subscribe(hero => this.hero = hero);
}
getHero(params: Params) : Promise<Hero> {
return this.heroService.getHero(+params['id']);
}
令我困惑的是为什么使用当前已注释掉的行而不是上面的行,我收到错误:"Cannot read property 'getHero' of undefined."
两个版本的代码看起来与我相同。
答案 0 :(得分:1)
Fat-arrow函数保留执行的上下文,允许this
&#34;变量&#34;与父范围中的相同。如果您使用.switchMap(this.getHero)
,那么this
将指向其他内容,而不是组件。
getHero(params: Params) : Promise<Hero> {
// "this" is not what you expect here
return this.heroService.getHero(+params['id']);
}
所以这里this.heroService
未定义。
答案 1 :(得分:1)
您需要bind
您的getHero功能。
.switchMap(this.getHero.bind(this))
否则您的更改是相同的。使用像这样的绑定允许您将getHero
作为独立函数传递给switchMap,而不会丢失this
对它的含义。
您可以尝试一下:
'use strict';
const foo = {
bar: 'baz',
getBar: function() {
return this.bar;
}
};
foo.getBar();
// => 'baz'
const myGetBar = foo.getBar;
myGetBar();
// => TypeError: Cannot read property 'bar' of undefined
const boundGetBar = foo.getBar.bind(foo);
boundGetBar();
// => 'baz'
const otherObj = { bar: 'hi' };
const otherBoundGetBar = foo.getBar.bind(otherObj);
otherboundGetBar();
// => 'hi'
otherObj.getBar = myGetBar;
otherObj.getBar();
// => 'hi'
答案 2 :(得分:0)
您不能在代码段中使用this.getHero
,因为
undefined
(服务在使用其数据之前返回Observable
所需的subscribe
get
修改者)。