在Angular服务的BehaviorSubject中编辑对象的一部分

时间:2018-07-05 14:36:04

标签: angular cordova ionic3 observable behaviorsubject

我有一个下载文件的应用程序。我想要一个单独的屏幕,该屏幕显示每个文件的下载进度。

这是我拥有的用于下载图形文件的功能(这是使用Cordova FileTransferObject类的):

    getDownloadDrawingObservable(drawing) {
    let tempFTO = this.fileTransfer.create();

    tempFTO.onProgress((progressEvent) => {
        if (progressEvent.lengthComputable) {
            this.ngZone.run(() => {
                // loading.setContent('Downloading drawing ' + progress + '%')
                let progress = Math.round(progressEvent.lengthComputable ? progressEvent.loaded * 100 / progressEvent.total : 0);
                drawing["Progress"] = progress + "%";
                console.log(progress + "%")


            })
        } else {
        }
    })

    return Observable.fromPromise(tempFTO.download(drawing["URL"], this.file.dataDirectory + drawing["DrawingNo"] + ".pdf", true, this.getDrawingRequestHeaders))
    // return tempFTO.download(URL, this.file.dataDirectory + drawingNo + ".pdf", true, this.getDrawingRequestHeaders)

}

我正在考虑创建一个单独的屏幕,该屏幕显示当前正在下载哪些文件以及它们的进度是什么。

我正在考虑使用行为主体来做到这一点。我的想法是,我将在“我的下载”屏幕上订阅行为主题,并且该主题的内容将在下载和进度逻辑中保持最新状态。

但是在完成这项工作时,我意识到要做到这一点,您将必须创建一个对象,类似于以下内容(图形名称,下载的进度):

{drawing1: 55, drawing2: 30}

并不断更新BehaviorSubject中对象的特定部分。

我的问题是;这是正确的吗?这是最好的方法吗?您甚至可以只更新BehaviorSubject对象的一部分并 next()来更新屏幕上的值吗?

任何帮助将不胜感激。

谢谢, 本。

1 个答案:

答案 0 :(得分:0)

我一直在寻找答案,但您给了我一个想法,希望对您有用:

  editDisplayName(displayName: string) {
    this.current$.next({...this.current$.getValue(), displayName})
  }