2016-12-01 11 views
3

これは本当に頭を悩ませています。ANGULAR 2 - コンポーネント共有データサービス

私はFirebaseを使用して、ソーシャルログインセットアップとちょっといいアプリを持っていると角2

すべてがリアルタイムでなければなりません。基本的には、ユーザーがFacebook経由でログインしたときに、個人情報がサービスに渡されObservableとして保存され、サービスに加入しているコンポーネントに即座に表示されるようにするため、コンポーネント内からObservableにアクセスできるようにしたい互いに直接リンクされておらず、階層から完全に外れている可能性もあります。なぜ、私は@InputやEventEmitterなどを使用できません。

私は多くのことを試しましたが、私が現在持っているのは、ユーザーデータをサービスに渡すログインコンポーネントと、サービスに当たった直後にリアルタイムでこのデータにアクセスできるランダムコンポーネントです。

*私のログインコンポーネント*

import { Component, OnInit } from '@angular/core'; 
import { AngularFire, AuthProviders, AuthMethods, FirebaseListObservable } from 'angularfire2'; 
import { Router } from '@angular/router'; 
import { GlobaluserService } from '../globaluser.service'; 
import { Subject } from 'rxjs/Subject'; 


@Component({ 
    selector: 'app-login', 
    templateUrl: './login.component.html', 
}) 
export class LoginComponent { 

    email: string; 
    password: string; 
    userData = {}; 
    _api; 

    constructor(public af: AngularFire, private router: Router, private api: GlobaluserService) { 
    this._api = this.api; 
    } 

    loginFacebook() { 
    this.af.auth.login({ 
     provider: AuthProviders.Facebook, 
     method: AuthMethods.Popup, 
    }).then((facebookUser) => { 

     this.userData = { 
      uID: facebookUser.auth.uid, 
      profilePic: facebookUser.auth.photoURL, 
      username: facebookUser.auth.displayName, 
      email: facebookUser.auth.email, 
      platform: 'facebook' 
     } 

     this._socialLoginProcess(this.userData); // this method is described below 

    }).catch((error) => { 
     console.log("Facebook failure: " + JSON.stringify(error)); 
    }); 
    } 

    // passes the user data to the shared service and outputs the data in the console 
    _socialLoginProcess(userData) { 
    this._api.saveData(userData); 
    console.log("Login Success: " + JSON.stringify(this.userData)); 
    } 


} 

*共有サービス*

import { Component, Injectable,Input,Output,EventEmitter } from '@angular/core'; 
import { Subject } from 'rxjs/Subject'; 
import { Observable } from 'rxjs/Observable'; 
import { BehaviorSubject } from 'rxjs/BehaviorSubject'; 
import 'rxjs/add/operator/map'; 


// Name Service 
export interface usersData { 
    uID: string, 
    profilePic: string, 
    username: string, 
    email: string, 
    platform: string 
} 


@Injectable() 
export class GlobaluserService { 

    sharingData: Observable<usersData[]> 

    private _sharingData: BehaviorSubject<usersData[]>; 

    private dataStore: { 
    sharingData: usersData[] 
    }; 


    constructor() { 
    this.dataStore = { sharingData: [] }; 
    this._sharingData = <BehaviorSubject<usersData[]>>new BehaviorSubject([]); 
    } 

    saveData(userData) { 
    this.sharingData = userData; 
    } 

    getData() { 
    console.log('get data function called' + JSON.stringify(this.sharingData)); 
    return this._sharingData.asObservable(); 
    } 


} 

*ランダム成分私は、このサービスからユーザーデータを取得できるようにしたい*

import { Component, OnInit, Input } from '@angular/core'; 
import { AngularFire, AuthProviders, FirebaseListObservable } from 'angularfire2'; 
import { Router } from '@angular/router'; 
import { GlobaluserService } from '../globaluser.service'; 

@Component({ 
selector: 'app-navigation', 
templateUrl: './navigation.component.html', 
styleUrls: ['./navigation.component.css'] 
}) 

export class NavigationComponent implements OnInit { 

    isAuth = false; 
    user = {}; 

    subscription : any; 
    userKonte  : any; 
    _userAPIservice: any; 

    constructor(private router: Router, private api: GlobaluserService) { 

     this.subscription = this.api.getData().subscribe(_sharingData => { 
      this.userKonte = _sharingData; 
      console.log(JSON.stringify(this.userKonte) ); 
     }); 

    } 

    ngOnInit(){ 
     console.log(JSON.stringify(this.userKonte) ); 
    } 





} 
+0

これは何が悪いですか?間違いや間違った結果が出ていますか?もしそうなら、説明してください。 –

+0

それは全く何も返されない、エラーを出さないが、私には何のデータも与えていない...私が望むデータのコンソール出力を得るが、サブスクリプションのコンポーネントに何も返されない。 –

答えて

0

代わりの

saveData(userData) { 
    this.sharingData = userData; 
} 

新しい価値を放出したいときgetDataは、被験者から観測可能になっているので、あなたがBehaviorSubject

saveData(userData) { 
    this._sharingData.next(userData); 
} 

nextに必要な、観測可能に加入nextが呼び出されたときに、被験者に新しい排出物を与えるでしょう

+0

Oh私はあなたにキスすることができます。私はこれが正確に何であるか尋ねるほど大胆なものになれますか? –

+0

件名は出版社と購読者の両方です。加入者の部分はあなたがasObservableから得た観測値です。あなたがそれに公開したいときは、 'next'を呼び出す必要があり、すべての加入者がそれを取得します。 –

+0

オハイオ州と私はあなたがそこにいる間、私はちょうど私が100%正しい、つまり、私のサービスが設定されている方法などを行っている方法を確認したいと思っています。 –

関連する問題