2016-05-12 5 views
1

を使用して、別のtypescriptですクラスから「この」のコンテキストを設定します。は、私はAngularJSでコントローラを定義するために活字体のクラスを使用していAngularJSに依存性注入

class ResourceServices {  
    public remove(resource, reload) {  
     if (confirm("Are you sure you want to delete this?")) { 
      resource.remove().then(() => { 
       reload(); 
      }); 
     } 
    } 
} 

angular.module("app").service("ResourceServices", ResourceServices); 

コンソールログは、私はそれがTrialsCtrlになりたいときthisは、ウィンドウのコンテキストを参照していることを示しています。私の問題はreload()方法は、それがthis.Trialthis.$scopeにアクセスできるように、TrialsCtrlのコンテキストで実行する必要があることです。どのように私はTrialsCtrlとしてthisを設定するreload()方法を伝えることができますか?または、私はこの種のものに使用しなければならないいくつかの他の回避策がありますか?

答えて

1

あなたは試してみました:コールバックとして渡すことになっている方法については

this.ResourceServices.remove(Trial, this.loadTrials.bind(this)); 

または

this.ResourceServices.remove(Trial,() => this.loadTrials()); 
+0

'this.loadTrials.bind(この)'作品、ありがとう!私も '()=> this.loadTrials'を試してみましたが、実際にコールバックを実行しないように見えました。私の第二の例では – Shaun

+0

[OK]を、私は見逃してカッコそれは 'this.ResourceServices.removeでなければなりません(試用版、()=> this.loadTrials());'両方の方法は、渡されたコールバックの原点コンテキストを維持する必要があります。 –

1

を(this.loadTrialsのように)

、矢印としてそれらを定義することが好ましいです。
loadTrials =() => { ... } 

そこで、彼らはFunction.prototype.bindが使用されているかどうかのコンテキストを維持します。

まだクラスのプロトタイプにそれを定義しながら、また、デコレータはメソッドをバインドする方法(core-decorators @autobindなど)に使用することができます

@autobind 
loadTrials() { ... } 
+0

ありがとう、それも同様に動作します。私が答えを探していたとき、私はこの1つに遭遇しました:http://stackoverflow.com/questions/14471975/how-can-i-preserve-lexical-scope-in​​-typescript-with-a-callback-function/21386201# 21386201あなたの答えは**オプション5 **と非常によく似ていますが、2番目の答えに示されています。あなたはこれらの質問が重複と見なされるほど類似していると思いますか? – Shaun

+0

はい、彼らはあります。ほぼすべての合理的な質問はすでにSOで議論されています。デコレータソリューションを追加しました。以前の質問では言及されていませんでした。 – estus

関連する問題