【发布时间】:2018-07-05 14:36:03
【问题描述】:
我有一个下载文件的应用程序。我想要的是一个单独的屏幕,显示每个文件的下载进度。
这是我下载绘图文件的功能(这是使用 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() 更新屏幕上的值吗?
任何帮助将不胜感激。
谢谢, 本。
【问题讨论】:
-
BehaviorSubject 保存您发出的最后一个值...您必须使用将覆盖最后一个值的新值发出,您不能只编辑部分 BS 值。
-
所以会是使用
getValue()之类的东西,找到我要更新的对象的那部分,然后再次发出? -
您在订阅 BehaviorSubject 时拥有最后一个值,比在您的情况下,假设您想将 drawing1 更改为 75,您只需
.next({drawing1: 75 , drawing2: 30}) 并且每个订阅该 BS 的订阅都将获得新状态 -
顺便说一句,最好为每次下载使用一个值,而不是保留 1 来预测整个下载,这样您就可以为每次下载提供一系列订阅。
-
好的,所以在 我的下载 页面上,我将订阅 BehaviorSubject 以获取它的内容并在屏幕上显示该信息。然后在服务中,这就是我要调用
next()来更新下载进度的地方。我不会订阅服务内的 BehaviorSubject,这就是为什么我的问题实际上只是关于更新。 @dAxx_ 我正在考虑将 behaviorSubject.getValue() 调用为最新值,然后在onProgress函数中,使用最新进度更新对象的特定部分,然后发出
标签: angular cordova ionic3 observable behaviorsubject