【问题标题】:ANGULAR 2 - Component Shared Data ServiceANGULAR 2 - 组件共享数据服务
【发布时间】:2017-04-15 11:51:56
【问题描述】:

这真的让我头疼。

我有一个不错的小应用,使用 Firebase 和 Angular 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 )  );
    }





}

【问题讨论】:

  • 这有什么问题?你得到错误,错误的结果吗?如果有,请解释。
  • 它根本没有返回任何东西,它没有给出错误,但它只是没有给我任何数据......在服务中我得到了我想要的数据的控制台输出,但在组件中订阅没有返回任何内容

标签: angular angular2-template angular2-services


【解决方案1】:

代替

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

当你想发出一个新值时,你需要在BehaviorSubject上next

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

因为getData 正在从主题中获取可观察对象,所以当调用next 时,可观察对象的订阅者将获得主题的新排放

【讨论】:

  • 哦,伙计……我可以吻你……太简单了。我可以大胆地问一下这到底是做什么的吗
  • 主题既是发布者又是订阅者。订阅者部分是您从 asObservable 获得的 observable。当你想发布到它时,你需要调用next,所有订阅者都可以得到它。
  • 哦,是的,虽然我有你在那里,但我只是想确保我这样做的方式是 100% 正确的,即我的服务设置方式等。对于生产应用程序?跨度>
  • 看起来不错,尽管您最好删除signingData observable,因为您使用的是getData
  • 哈哈对不起,我把你带到了那里。当我刷新浏览器时,它不会保留数据,用户仍然保持登录状态,但我想那是因为 firebase 的工作方式,但数据服务不记得任何东西.. 你不知道我接下来应该研究什么来保持持久服务你会
猜你喜欢
  • 2017-01-04
  • 2017-11-06
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 2016-08-23
  • 1970-01-01
  • 2020-06-18
相关资源
最近更新 更多