Angular:使用 RxJs/BehaviorSubject 在组件之间动态共享数据

标签 angular rxjs angular-services behaviorsubject subject-observer

我有两个同级组件并排显示,比方说组件 A 和组件 B。

Component-A 有表单控件,一旦用户填写表单,我需要执行一些业务逻辑并将数据显示到 Component-B 中。

我已经创建了服务来共享数据。目前,当用户进行任何更改时,数据在组件 B 中可用,但它不会自动显示,我在组件 B 上放置了“刷新”按钮,当我单击该按钮时,数据正在显示。

我想要实现的是在没有用户点击的情况下从组件 A 到组件 B 的数据流顺畅。出于某种原因,我无法订阅组件 B 中的服务。

使用@angular 版本~4.0.0

Nav.Service.ts

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';

@Injectable()
export class NavService {

  // Observable navItem source
  private _navItemSource = new BehaviorSubject<string>(null);

  // Observable navItem stream
  navItem$ = this._navItemSource.asObservable();

  changeNav(query: string) {
    this._navItemSource.next(query);
    console.log("Inside changeNav",query )
  }

}

组件-A

Private getSelectedComponents() {
         this._navService.changeNav(this.searchValue) //dataFromControls is string data..
         this.dataFromSisterComponent = '';   
}

HTML:

 <div class="form-group">
        <div class="form-inline">
            <label for="searchbox" class="control-label">Search : </label>
            <input id="searchbox"class="form-control" type="text" #searchValue (keyup)="0"/>
            <button class="btn btn-success" (click)="getSelectedComponents()">Add</button>
        </div>        
    </div>

组件-B

import { Component, Input, Output, EventEmitter, ViewChild, OnInit, OnDestroy} from '@angular/core';
import { FormControl, FormGroup} from '@angular/forms';
import { DataService} from '../../Services/DataService/data.service';
import { Subscription }   from 'rxjs/Subscription';
import { NavService } from '../../Services/NavService/nav.service';

@Component({
    moduleId: module.id,
    selector:'ComponentB',
    templateUrl: 'Component-B.component.html',
})
export class Component-B implements OnInit {
    subscription: Subscription;
    dataFromComponentA: string;

   shows: any;
   error: string;
   item: string;

    constructor(private dataService: DataService,private _navService: NavService)
    {    
    }

    ngOnInit() {
       this.getQuery(); 
    }

    getQuery() {
        this.subscription = this._navService.navItem$
         .subscribe(
         item => this.item = item,
          err => this.error = err
         );
        dataFromComponentA=this.item 
        console.log("Inside getquery",this.item )
    }

    ngOnDestroy() {
        this.subscription.unsubscribe();
        console.log("ngOnDestroy")
    }
}

HTML

In below html, I want to display data automatically in {{dataFromComponentA}} when user made changes in ComponentA. Currently data is getting displayed when I click on "Refresh" button and I wanted to avoid this button click.

<h3>Template Components 123 </h3>
<button class="btn btn-success" (click)="getQuery()">Refresh</button>
<p><b>Value coming from Component-A</b>
  {{ dataFromComponentA }}
  OK </p>

最佳答案

您需要传递给 subscribe 的回调中的代码

getQuery() {
    this.subscription = this._navService.navItem$
     .subscribe(
       item => {
         this.item = item,
         dataFromComponentA=this.item 
         console.log("Inside getquery",this.item )
       },
       err => this.error = err
     );
}

关于Angular:使用 RxJs/BehaviorSubject 在组件之间动态共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43559508/

相关文章:

angular - 如何将样式表中的值获取到代码中以便以编程方式使用它?

angular - 如何在 AlertController - Ionic 3 中使用变量显示消息正文?

angular - RxJS 在使用 startWith 时跳过去抖动

javascript - Momentjs 倒计时 - 持续时间显示负数

javascript - Rxjs 如何知道可观察到的订阅者有多少?

javascript - AngularJS Factory中enforce参数的含义是什么

javascript - 在 AngularJS 上使用下拉菜单传递参数

html - 使用<template ngFor>代替* ngFor时出现奇怪的间隙

Angular ngIf 渲染

Angular 4 订阅 observable 在更改后不会更新