2017-04-01 4 views
2

進捗ボタンとして機能するコンポーネントsi-buttonを作成しました(クリックすると、ロードインジケータが表示されます)。正しいコンテキストで角度実行メソッドが渡されました

私はこのようなsi-buttonコンポーネントにクリックで実行されるメソッドへの参照渡し:register方法が約束を返し、ローディングインジケータがあれば、約束のISN」として示されている

<si-button [pb-click]="register">Register</si-button> 

を解決されました。 SIButtonComponentクラスでは、ボタンをクリックするとregisterメソッドが実行されます。

SIButtonComponent

export class SIButtonComponent{ 
    ... 

    @Input('pb-click') pbClick :() => Promise<any> = null; 

    handleClick($event){ 
     this.loading = true; 

     this.pbClick().then(() => { 
      this.showSuccess(); 
     }, (data) => { 
      this.showError(); 
     }); 
    } 

    ... 
} 

RegisterComponent

export class RegisterComponent{ 
    register() : Promise<any> { 
     return new Promise((resolve, reject) => { 
      this.auth.register(this.email, this.password).subscribe((org : Organization) => { 
       resolve(); 
      }, (error : ErrorResponse) => { 
       reject(); 
      }); 
     }); 
    } 
} 

通報 方法registerSIButtonComponentのインスタンスから実行されるので、thisSIButtonComponentインスタンスではなくRegisterComponentを指します。どのようにこれを正しく行う必要がありますか? pb-clickパラメータには@Inputではなく@Outputを使用する方が理にかなっていますが、クリックイベントが発生した後にどのようにしてPromise -instanceを取得できるかわかりません。

export class RegisterComponent { 
    registerFunction =() => this.register(); 
    ... 
} 

<si-button [pb-click]="registerFunction">Register</si-button> 

答えて

2

は、代わりに矢印関数を渡しますか?私はその背後にある力学を理解したいです。 ありがとう!
+0

これは素晴らしい作品が、なぜ: –

+0

矢印関数は 'this'にバインドされているためです。それがなぜ存在するのかの主な理由です(減らされた冗長性以外)。 'function(){return this.register();}と同じです。 }。バインド(これ) '。 –

+0

素晴らしいです、ありがとう! –

関連する問題