我有这个(简化的)服务:
@Injectable()
export class DataService {
constructor(protected url: string) { }
private handleError(error: Response) {
console.log(this.url);
return Observable.throw(new AppError(error));
}
getAll() {
return this.http.get(this.url)
.map(response => response.json())
.catch(this.handleError);
}
}
在handleError
函数中,this.url未定义。为什么?从this.handleError
调用catch
时,如何获取当前实例?
我不认为这是this
的常规用法,Observable
在尝试应用常用的JS解决方案时会给我带来很多TS错误。
非常感谢。
答案 0 :(得分:-1)
角度服务的构造函数与您知道的经典构造函数不同。并且该服务不应该由您自己实例化。 Angular本身将实例化您的服务,并将通过依赖注入传递实例。因为你不能实例化它,因为Angular应该为你做这样,所以它的参数列表中只能有服务或其他Injectables,这样Angular就会知道它并且能够将它的实例传递给你的构造函数。
如果您要为url
属性分配内容,则必须添加单独的方法,以便为您执行此操作,或者只是将网址公开并直接分配给它。
但是为了拥有它,我建议您将代码更改为以下
return this.http.get(this.url)
.map(response => response.json())
.catch(error => this.handleError(error));
请记住,lambda表达式(箭头函数)已添加到ES6中,特别是对于上下文问题。在ES6中,它们比功能更轻巧。但TypeScript编译器将其全部转换为函数。所以这里唯一的影响是上下文没有改变。但我希望将来他们会被翻译成lambdas并且会更有效。