2016-07-21 7 views
0

私はマークダウンをレンダリングする角度2でパイプとして使用されている活字体で次のクラスを持っています。これは、エラーなしでコンパイルが、マークされた行に実行時例外を打つ:TypeScriptのlambda内のクラススコープへのアクセスは未定義ですか?

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は私が上記でコメントしたのと同じ行を指します。どうしてこれなの?私のラムダ式の中でparseMediaメソッドにアクセスする必要があるとIDEから報告されています。

これに対する最善の解決策は何ですか?

this.remarkable.use(this.parseVideos); 

その後方法はMarkdownPipeのインスタンスにthisもはやポイントが呼び出されていない場合:あなたがここにそれを渡すためだ

答えて

4

あなたは別の矢印機能を持たせることができるいずれかthisのための権利範囲を維持するために:

this.remarkable.use(md => this.parseVideos(md)); 

それともFunction.prototype.bind()を使用することができます。

this.remarkable.use(this.parseVideos.bind(this)); 
+0

右。私はそれがこのようなものになると思った。ありがとう。私のIDEオートコンプリートは私を捨てました。 – ReactingToAngularVues

+0

クロージャー/ラムダを直接渡すことができるケースはありますか? – stt106

+0

@ stt106あなたは何を意味するのか分かりませんが、明確にすることはできますか? OPで、この場合には間違っていただきまし –

関連する問題