ANGULAR 2 - 组件共享数据服务

2024-03-18

这真的让我很头疼。

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





}

代替

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

当你想发出一个新值时,你需要next on the BehaviorSubject

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

Because getData从主题获取可观察量,可观察量的订阅者将在以下情况下获得该主题的新发射:next叫做

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ANGULAR 2 - 组件共享数据服务 的相关文章

随机推荐

  • 在 AWK 中将空白字段替换为零

    我希望使用 awk 将空白字段替换为零 但是当我使用 sed s 0 文件时 当我只想考虑丢失的数据时 我似乎会替换所有空格 由于某些空字段 使用 awk print NF 文件返回不同的字段号 即 9 4 input 590073920
  • Eclipse PDT + xdebug:单步执行损坏的代码

    我使用 PHP 5 6 2 和 xdebug 2 2 5 以及 Eclipse 4 4 1 和 PDT 3 3 1 我正在尝试在本地服务器 localhost 上设置调试器 xdebug 但有些东西似乎被破坏了 当我启动调试会话时 Ecli
  • t sql“select case”与“if ... else”以及有关“开始”的解释

    我对 t sql 的经验很少 我必须编写一个存储的 这是我存储的 USE myDatabase GO SET ANSI NULLS ON GO SET QUOTED IDENTIFIER ON GO CREATE PROCEDURE dbo
  • java中String类如何用构造函数初始化

    public String String original this value original value this hash original hash 我不明白原始数据是如何转换为字符数组的 如果我用不同的代码尝试它 它会抛出编译错
  • 在 C# 中实现 OPOS 设备

    对于与旧版 POS 应用程序的某些互操作 我想知道是否可以在 C 中实现虚假的 OPOS 设备 基本上我会实现一个假键盘 它接受网络请求并将按键传递给遗留应用程序 有谁知道这是否可能或在哪里可以获得文档 我认为 OPOS 只是调用由注册表项
  • 将多列粘贴在一起

    我在数据框中有一堆列 我想将它们粘贴在一起 用 分隔 如下所示 data lt data frame a 1 3 b c a b c c c d e f d c g h i i e a b c d 1 a d g 2 b e h 3 c f
  • 如何对 Django 数据库迁移进行单元测试?

    我们使用 django 迁移 django v1 7 更改了数据库 数据库中存在的数据不再有效 基本上我想通过在单元测试中构建预迁移数据库 添加一些数据 应用迁移来测试迁移 然后确认一切顺利 一个人如何 加载单元测试时阻止新的迁移 I fo
  • 没有 AVAsset 的纯色 AVMutableComposition

    这是我的最终目标 我想使用AVVideoCompositionCoreAnimationTool从 Core Animation 创建视频 我不会在此组合中使用现有的 AVAsset 我的问题是 我该如何使用AVMutableComposi
  • 猫鼬预保存和验证之间的区别?什么时候使用哪一个?

    目前我正在使用pre save 进行验证 UserSchema pre save true function next done var self this in case inside a callback var msg helper
  • Angular 4 材质是否像 bootstrap 一样响应式?

    我正在使用 Angular 4 开始一个新项目 需要创建响应灵敏且令人愉悦的用户界面 bootstrap 为您提供响应能力 但没有物质感 棱角分明的材质提供了良好的 UI 体验https material angular io https
  • 防止箭头键更改选定的单选按钮

    我有几个单选按钮 我想阻止按下向上 向下箭头键来更改选定的单选按钮 如果您选择其中一个单选按钮 然后按向上 向下箭头键 它将选择上一个或下一个单选按钮 相反 我希望选择保持不变 为此我可以使用event preventDefault 在某些
  • Jgrid 生成 XML 时出现问题

    我正在使用 Jgrid 我像我们大多数人一样使用 Xml 将数据注入到网格中 我想要批量更新数据库 我的要求是 当我单击 保存更改 时 它会生成当前 更新的 网格数据的 Xml 那么 我如何生成Jgrid数据的Xml 请帮忙 这是代码
  • C++ 模板:返回 list::iterator

    我怎样才能使下面的代码工作 在编译过程中 我收到一条错误消息 告诉我searchForResource函数没有返回类型 template
  • 为什么我的 UILabel 不显示 NSInteger

    我有一个 ViewController 和 GameController 类 它是 NSObject 的子类 视图控制器有一个链接到它的按钮 并触发一个初始化 GameController 类的 IBAction 在 GameControl
  • 剪切背景以露出下面的图层

    有没有办法剪切 div 背景以暴露下面的图层 就像这样 to this 欢迎任何前沿的 CSS 规则 UPDATE 好的 我做了一个示例代码 http jsfiddle net coma 9ae7g 1 http jsfiddle net
  • 创建新文件时,vscode 让我选择一个编辑器

    When creating a new file vscode let me select an editor It hasn t do so and I don t want to choose one because I only us
  • 我应该如何处理 Perl 中不再使用的对象?

    我正在编写一个链接到外部资源的类 其中一种方法是破坏外部资源的删除方法 不应对该对象进行进一步的方法调用 我正在考虑设置一个标志 如果设置了标志 那么就会在所有方法中死亡 但是有没有更好 更简单的方法呢 也许涉及破坏 到目前为止 我真的很喜
  • Android Studio:“libpng 警告:iCCP:无法识别已编辑的已知 sRGB 配置文件”

    我花了几个小时试图解决这个问题 app mergeDebugResources AAPT err 927129865 C Users Will AndroidStudioProjects Splitter2 app build interm
  • 从两个绝对路径获取相对路径

    我有两个绝对文件系统路径 A 和 B 并且我想生成第三个文件系统路径来表示 A 相对于 B 使用案例 管理播放列表的媒体播放器 用户将文件添加到播放列表 新文件路径已添加到播放列表相对于播放列表路径 将来 整个音乐目录 包括播放列表 都会转
  • ANGULAR 2 - 组件共享数据服务

    这真的让我很头疼 我有一个不错的小应用程序 使用 Firebase 和 Angular 2 设置社交登录 一切都应该是实时的 基本上 当用户通过 Facebook 登录时 我希望将他们的个人信息传递到服务并存储为 Observable 并立