Rxjs:如何从一个observable切换到另一个中间流

时间:2017-12-16 02:26:55

标签: angular rxjs rxjs5

目前,我只想尝试实现以下目标: - 我有一个文本输入字段和一个按钮。单击按钮时,从输入中获取值(通过rxjs)。

以下是我的设置。目前有一个Observable的按钮单击,我有输入文本字段当前正在更新BehaviorSubject。我努力执行或解决的问题是,当点击流发出一个值然后切换到'到输入流,这是传递给订阅的是输入值。

目前传递给订阅的值始终是BehaviorSubject类型(当我没有使用BS时最初是Observable)。

@Component({
  selector: 'app-global-dashboard',
  template: `
     <input type="text" name="" id="new-country-input" 
     (keyup)="countryInput$.next($event.target.value)">
     <button (click)="handleAddCountryClick()" id="add-country">Add 
     country</button>

     <ul>
      <li *ngFor="let tile of tiles">
       {{tile.name}}
      </li>
     </ul>
  `,
  styleUrls: ['./global-dashboard.component.scss']
})
export class GlobalDashboardComponent implements OnInit, AfterViewInit 
{

   public countryInput = '';
   public countryInput$ = new BehaviorSubject<string>('');
   public tiles: object[];

   constructor(private http: Http) {
     this.tiles = [];
   }

   ngAfterViewInit() {

      const button = document.querySelector('#add-country');
      const addClick$ = Observable.fromEvent(button, 'click');

      const inputAfterClick$ = addClick$
         .map(() => this.countryInput$);

      inputAfterClick$.subscribe((country) => {
         console.log('country', country); // < This is always BS type rather than the underlying string
         this.doRequest(country);
      });
  }

2 个答案:

答案 0 :(得分:1)

将地图更改为flatMap

  const inputAfterClick$ = addClick$
     .flatMap(() => this.countryInput$);

答案 1 :(得分:0)

由于您使用的是BehaviouralSubject,因此您需要获取的是主题的当前值。无需切换流:

const addClick$ = Observable.fromEvent(button, 'click');

addClick$.subscribe(()=>{
    //this will give you the current value of your behavioural subject
    console.log(this.countryInput$.value);
})

如果你想在更多的反应中得到输入的价值,那就是#34;方式,你最好使用Reactive Forms