【问题标题】:Manually emitting a value to an observable手动向可观察对象发出值
【发布时间】:2018-10-16 00:44:15
【问题描述】:

我在 Angular 6 应用程序中使用 rxjs,并且我正在构建一个组件,该组件具有 downloadUrl: Observable<string>,当我从 firebase 存储中获取 url 时会填充该组件。

我需要分配一个初始值,该值使用@Input attribute (@Input imagesrc:string) 传递给组件,并且我尝试将一个值发送到downloadurl (在ngOnInit 中):

let emitter;
this.downloadURL = Observable.create(e => emitter = e)
emitter.next(this.imagesrc);

但是,这是不正确的,因为我收到了 emitter 未定义的控制台错误消息。我如何能够手动将 imagesrc 的值发送到 downloadURL?

【问题讨论】:

  • 你应该先订阅downloadURL.subscribe() emitter.next();

标签: angular rxjs6


【解决方案1】:

我不太了解你的实现。

假设这是你的FileService

import { AngularFireStorage } from '@angular/fire/storage';
import { Injectable } from '@angular/core';
import { from, Observable } from 'rxjs';
import { switchMap } from 'rxjs/operators';

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

  constructor(private storage: AngularFireStorage) { }

  upload(path: string, file: File): Observable<string> {
    return from(this.storage.upload(path, file))
      .pipe(switchMap(_ => this.storage.ref(path).getDownloadURL()));
  }

  delete(downloadUrl) {
    return this.storage.storage.refFromURL(downloadUrl).delete();
  }

}

假设你想暴露一个初始值为this.imagesrc的Observable,然后一旦你得到下载url,你想更新这个Observable的值,你可以试试下面的方法:

private emitter: BehaviorSubject<string> = new BehaviorSubject<string>('');
emitter$: Observable<string> = this.emitter.asObservable();
...
constructor(private fileService: FileService) {}
...
ngOnChanges() {
  this.emitter.next(this.imagesrc);
}
...
functionWhereYouAreExpectingDownloadUrl() {
  ...
  this.fileService.upload(pathToStoreTheFileAt, fileToStore)
    .subscribe(downloadUrl => this.emitter.next(downloadUrl));
}

在这里,我们创建了一个BehaviorSubject&lt;string&gt;,可以使用this.imagesrc 进行初始化。但是我们保留了这个private 并公开了这个asObservable。然后,一旦我们得到downloadUrl,我们就会在发射器上调用next,将新值推送到我们的emitter$Observable

【讨论】:

  • 您好,感谢您的解决方案,非常感谢。在您的示例中,您已经表明我需要先获取 downloadURL - 但是,我想在用户尝试上传文件之前公开下载 URL(即我想显示一个占位符图像,该图像将位于 imagesrc 中) .我想的一种方法是显示一个单独的图像元素并隐藏要使用 downloadURL 的元素。但是,为此我需要管理隐藏/显示这两个元素。我希望能够在组件初始化时设置 downloadURL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 2020-07-09
  • 2018-07-29
相关资源
最近更新 更多