2017-11-09 9 views
0

私のアプリでは、同じパラメータを必要とする3つの異なる機能に渡ってコードを再利用するという賢明なアイデアがあると思っていました。動的関数呼び出しで正しい「this」サービスを取得する

サービス内の正しいエンドポイント関数に変数を割り当てて、その変数を呼び出しようとしましたが、参照によって関数が呼び出されたときに、thisはもはやサービスオブジェクトを参照しませんでしたか?私は確信していませんが、私が得たエラーは基本的にthisがサービス内で定義されていないことでした。私のコンポーネントの内部

機能:

submitRefurb() { 
    let endpoint = this.refurbService.addRefurb; 
    if (this.updating) { 
     endpoint = this.refurbService.updateRefurb; 
    } else if (this.refurb.id) { 
     endpoint = this.refurbService.verifyRefurb; 
    } 
    this.loading = true; 
    endpoint(this.refurb).subscribe(//This is where we have the problem 
     (result) => { 
     console.log(result); 
     }, 
     (error) => { 
     this.loading = false; 
     } 
    ); 
    } 

Refurbsサービス:

今、私は最終的にそれがむしろ直接に割り当てるよりも、単に文字列としてendpoint変数を割り当てることによって動作するようになりました関数は次のようになります。

let endpoint = 'addRefurb'; ... this.refurbService[endpoint](this.refurb)

しかし、私はまだ何がうまく行っていないかを十分に理解していません。違いが何であるか誰でも説明できますか?私がやったやり方よりも、それを扱う良い方法はありますか?

+0

を'関数のようなものです:' endpoint.call(this、this.refurb).subscribe(..) 'と何が起こるかを見てください –

+0

@OsmanCea私が間違っている場合は訂正しますが、RefurbService内の「this」ではなく「this」にバインドしませんか? – Ecksters

+1

正解...私はそれをコンポーネント「this」にバインドしたいと誤解しました。とにかく、それをサービスに戻したい場合は、 'endpoint.call(this、this.refurb)'を 'endpoint.call(this.refurbService、this.refurb)'に置き換えてください。 –

答えて

2

あなたはbindメソッドを使用できます: `エンドポイントを呼び出してみてください

submitRefurb() { 
    let endpoint = this.refurbService.addRefurb.bind(this.refurbService); 
    if (this.updating) { 
     endpoint = this.refurbService.updateRefurb.bind(this.refurbService); 
    } else if (this.refurb.id) { 
     endpoint = this.refurbService.verifyRefurb.bind(this.refurbService); 
    } 
    this.loading = true; 
    endpoint(this.refurb).subscribe(//This is where we have the problem 
     (result) => { 
     console.log(result); 
     }, 
     (error) => { 
     this.loading = false; 
     } 
    ); 
    } 
+0

@ OsmanCeaがコメントしたアプローチを好むと思いますが、標準的なEC5互換の方法を示しているので、これを答えとして受け入れます。@OsmanCeaがコメントしたアプローチを好むと思いますが、endpoint.call(this.refurbService、this.refurb)それは繰り返しの少ないコードなので、3つの割り当て。 – Ecksters

1

矢印機能を使用します。

let endpoint = (refurbData) => this.refurbService.addRefurb(refurbData); 

それとも観測可能ではなく、エンドポイントを格納します。

let obs = this.refurbService.addRefurb(this.refurb); 
... 
obs.subscribe(...) 
+0

非常に良い答えは、これと他のものの間で選択するのは難しいですが、私は他のものと一緒に行ったのは主に、直接のコードに従ったものであり、マイナーな派生であり、より "低レベル"のES5のjavascriptソリューション。 これらは両方とも、しっかりとしたクリーンなソリューションでしたが、今後もそれらを覚えておきたいと思います。 2番目のオプションについて簡単に質問しますが、割り当てが発生するたびにサービスの機能を実行するのではなく、実際のサーバーコールまでサービスの機能を実行しませんか、または残りのロジックは購読時にのみ実行されますか? – Ecksters

関連する問題