我在TypeScript中有以下类,用作Angular 2的管道来渲染markdown。它编译时没有错误,但在运行时在标记的行上遇到异常:
var Remarkable = require('remarkable');
@Pipe({
name: 'markdown'
})
export class MarkdownPipe implements PipeTransform {
public remarkable;
constructor(private sanitizer: DomSanitizationService) {
this.remarkable = new Remarkable({
typographer: true
});
this.remarkable.use(this.parseVideos);
}
transform(value: string) : SafeHtml {
if (value != null) {
return this.sanitizer.bypassSecurityTrustHtml(this.remarkable.render(value));
}
return null;
}
public parseVideos(md) : void {
md.inline.ruler.push('video', (state) => {
return this.parseMedia(state, '@', 'video'); // this is undefined
});
}
public parseMedia(state, startingMarker, tokenName) : boolean {
// do stuff
}
}
当我的代码尝试执行时,我收到运行时错误,告诉我:
_this
指的是我在上面评论过的同一行。为什么是这样?我的IDE报告我应该可以访问lambda表达式中的parseMedia
方法。
最佳解决方案是什么?
答案 0 :(得分:4)
那是因为你在这里传递了它:
this.remarkable.use(this.parseVideos);
然后,当调用该方法时,this
不再指向您的MarkdownPipe
实例。
为了保留this
的正确范围,您可以使用另一个箭头功能:
this.remarkable.use(md => this.parseVideos(md));
或者您可以使用Function.prototype.bind():
this.remarkable.use(this.parseVideos.bind(this));