行为主体问题

时间:2018-12-18 21:59:39

标签: angular

嗯,一切正常,但不像我预期的那样。当用户保存图像时,我正在尝试从组件A获取当前值,并通过服务(使用BehaviorSubject共享该img并将其存储在组件B中。我知道我总是会得到当前值值,但我的目的是存储最后一个值并保存我想要的所有图像,而不仅仅是用最后一个值覆盖当前值。

当前问题:我总是只存储最后一张图像。  我的期望:存储所有图像

我试图使用Subject,ReplaySubject(1)而不是BehaviorSubject来只是不初始化值,或者尝试使用具有跳过运算符的BehaviorSubject来获取最后一个值。我真的不知道我在想什么。另外,我删除了ngOnDestroy()只是为了知道是否要销毁整个变量,尽管这没有意义,因为我在获取值后将其存储。

// image-state.service

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

@Injectable({
  providedIn: 'root'
})
export class ImageStateService {


  private imgStateSubject = new BehaviorSubject<string>('');
  imageState$ = this.imgStateSubject.asObservable();

  constructor() {
   }

   getImage(val: string) {
    this.imgStateSubject.next(val);
   }
}

//组分A的发射值

 onSave(severity: string, data: string) {
    this.confirmationService.confirm({
      message: 'Are you sure that you want to save it in Gallery?',
      accept: () => {
        this.imageStateService.getImage(data); // Getting the value
        this.messageService.add({ severity: severity, summary: 'Success', detail: 'Data Saved' });
      }
    });
  }

//接收值(组分B)

images: Image[];
  subscription: Subscription;

  constructor(private imageStateService: ImageStateService) { }

  ngOnInit() {
    this.images = [];
    this.subscription = this.imageStateService.imageState$
      .subscribe(val => this.images.push
        ({source: `${val}`, alt: 'Description for Image 1', title: 'Title 1'}));

  }

  ngOnDestroy() {
    this.subscription.unsubscribe();
  }

}

1 个答案:

答案 0 :(得分:-1)

BehaviorSubject仅存储当前(最后)值。看看ReplaySubject,您可以指定要保留在其中的缓冲区。

您可以使用运算符shareReplay将缓冲区添加到任何流中以存储值。

http://reactivex.io/rxjs/manual/overview.html#replaysubject https://www.learnrxjs.io/operators/multicasting/sharereplay.html