2015-10-28 4 views
16

Angular2サービスでオブザーバブルを使用するためのサンプル/ガイドの方法を見つけるのに苦労しています。 EventEmitterでバインドされたhtmlテンプレート用のものがありますが、それはサービスのために正しいとは思われません。Angular2サービスで正しいEventEmitterまたはObservable Syntaxを見つけることができません

大きな動機のテーマの1つは、Angular2の約束から離れていますが、新しい構文が正しいとは言えません。私は

  • をやっている

    は、私は他の サービスやコンポーネントに注入することができるFirebaseAuthサービスを持っています。他のサービスのような他の事を行うために使用することができます

  • 私は(約束を置き換えるために)観測可能を返すようにしたいユーザー
  • を作成するために、私の例では、 firebaseへの非同期呼び出しを行う機能を持っている
  • これは

約束はこの例のために最善の解決策ですが、私は観察可能ウェイが何であるかを把握したい場合、私は大丈夫だよ解決されたときに、プロファイルを作成します。

マイサービス:

/*DS Work on firebase Auth */ 
import {Injectable} from 'angular2/angular2'; 

@Injectable() 
export class FirebaseAuth { 
    ref = new Firebase('https://myfirebase.firebaseio.com'); 
    //check if user is logged in 
    getAuth(): any { 
    return this.ref.getAuth(); 
    } 

    //register a new user 
    createUser(user: any): Promise<any> { 
    return new Promise((resolve, reject) => { 
     this.ref.createUser(user, function(error, userData) { 
     if (error) { 
      reject(error); 
      console.log('Error creating user:", error'); 
     } else { 
      resolve(userData); 
      console.log('Successfully created user account with uid:', userData.uid); 
     } 
     }) 
    }) 
    } 
}; 

どのように私が観察および/または持つEventEmitterを使用するには、このを書き換えるでしょうか?

答えて

19

は、実際にはそこにいくつかの変更

createUser(user: any): any { 
    return new Observable.create(observer => { 
     this.ref.createUser(user, function(error, userData) { 
     if (error) { 
      observer.error(error); 
      console.log("Error creating user:", error); 
     } else { 
      observer.next('success'); 
      observer.complete(); 
      console.log('Successfully created user account with uid:', userData.uid); 
     } 
     }); 
    }) 
    } 

そして、あなたはそれに suscribesubscribethenの同等である)ことができ、ほぼ同じことです。

ここで一方の観測

constructor() { 
    this.createUser({}).subscribe(
     (data) => console.log(data), // Handle if success 
     (error) => console.log(error)); // Handle if error 
} 

EventEmitterを使用した例でplnkrだが(angular2が最後のバージョンに移動するのでdocumentationは少し異なりますが、それはまだ理解できるのです)Subjectです。

_emitter = new EventEmitter(); 
constructor() { 
    // Subscribe right away so we don't miss the data! 
    this._emitter.toRx().subscribe((data) => console.log(data), (err) => console.log(err)); 
} 
createUser(user: any) { 
    this.ref.createUser(user, function(error, userData) { 
     if (error) { 
      this._emitter.throw(error); 
      console.log('Error creating user:", error'); 
     } else { 
      this._emitter.next(userData); 
      this._emitter.return(); This will dispose the subscription 
      console.log('Successfully created user account with uid:', userData.uid); 
     } 
    }) 
} 

ここにはplnkrのEventEmitterを使用しています。

スーパーショートの違い:Observableは、サブスクライバを見つけたときにデータを放出し始めます。サブジェクトがあるかどうかにかかわらず、サブジェクトは情報を送信します。

IはtoRx()を使用持つEventEmitter例において。これにより、Subjectが公開されますが、it's being refactoredは公開されており、もうtoRx()は必要ありません。AngularConnect's 2015会議にベン・レッシュによる

RxJS In-Depthを更新しました

便利なリソース。この

を指摘しロブWormaldへ

ありがとうございますSara Robinson's talkと彼女demo appを見ると、それは件名対観測の意味にhere

+2

良い答えを実行している見ることができます。 firebaseについては、具体的にはSara RobinsonのAngularConnect [talk](https://www.youtube.com/watch?v=RD0xYicNcaY)と[demo app](https://github.com/sararob/angular2base)を参照してください。 FirebaseとAngular2のトリックです。 – robwormald

+0

**非常に参考になっています!**このエリックは大変ありがとうございました。 この例では、Observableを使用するとEventEmitterより優れているようです。代わりにそれを使用する理由は何ですか? サラの話は素晴らしい話ですが、実際には数回それを見て、パイプを使う考えが大好きです。彼女の例がコンポーネントに密​​接に結びついているだけで、私のサービスもFirebaseと話をする必要があるということだけが問題です。 –

+1

答えは技術的な答えよりも個人的な意見ですので、私はそれを謝ります。 [EventEmitterのドキュメント](https://angular.io/docs/ts/latest/api/core/EventEmitter-class.html)には、「カスタムイベントを送出するためのディレクティブとコンポーネントによる使用」という言い換えれば、コンポーネント/ディレクティブ間でイベントを発生させる目的で、より複雑なシナリオを処理するのはその目的ではありません。もちろん、あなたはそれをあなたが望むように使うことができますが、あなたがそれを悪用していると思います。 –

関連する問題