加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Angular 2实时进度条

发布时间:2020-12-17 07:14:45 所属栏目:安全 来源:网络整理
导读:在我的Angular 2应用程序中,我订阅了一个简单的服务来从远程数据库获取数据并在表视图中显示它们.一切正常,现在我想添加一个进度条来显示从服务器获取数据的实时进度. 我目前正在使用 primeng progressbar组件来显示进度.但它只能提供一个固定的时间来显示进
在我的Angular 2应用程序中,我订阅了一个简单的服务来从远程数据库获取数据并在表视图中显示它们.一切正常,现在我想添加一个进度条来显示从服务器获取数据的实时进度.
我目前正在使用 primeng progressbar组件来显示进度.但它只能提供一个固定的时间来显示进度,如下面的代码所示,

ngOnInit() {
    let interval = setInterval(() => {
        this.value = this.value + Math.floor(Math.random() * 10) + 1;
        if(this.value >= 100) {
            this.value = 100;
            this.msgs = [{severity: 'info',summary: 'Success',detail: 'Process Completed'}];
            clearInterval(interval);
        }
    },2000);
}

2000表示进度条显示的时间(以毫秒为单位).
但我需要的不是这个,我需要最初显示进度条并动态和实时填充进度条,直到实际数据提取完成.只有在数据提取完成之后且数据呈现到表视图之前,才应完成进度条并且不可见.

除了为进度条提供静态时间之外,还有其他逻辑吗?欢迎除primeng之外的任何其他解决方案.

提前致谢.

更新:

我的服务类,

@Injectable()
export class MyService {
    constructor(public http:Http) {
    }

search(criteria:SearchObject):Observable<ResponSEObject>{
    let headers = new Headers({ 'Content-Type': 'application/json' });
    let options = new RequestOptions({ headers: headers });    
    return        this.http.post(URL,JSON.stringify(criteria),options)
      .map(res => res.json())
}

}

我的组件类,

export class SearchComponent{

    var response;
    constructor(public myService:MyService) {
    }

    search(): void {

     //Need to show the progress bar here

        var criteria = new SearchObject();
        //set data to the criteria object
       this.myService.search(criteria)
         .subscribe(
           data => {
             this.response = data;;
         },);            
      //close the progress bar after completing communicating with server

    }

}

解决方法

您可以利用XHR提供的onprogress事件.这允许获得有关下载进度的提示.

Angular2不支持此功能,但您可以通过扩展BrowserXhr类来插入它:

@Injectable()
export class CustomBrowserXhr extends BrowserXhr {
  constructor(private service:ProgressService) {}
  build(): any {
    let xhr = super.build();
    xhr.onprogress = (event) => {
      service.progressEventObservable.next(event);
    };
    return <any>(xhr);
  }
}

并使用扩展名覆盖BrowserXhr提供程序:

bootstrap(AppComponent,[
  HTTP_PROVIDERS,provide(BrowserXhr,{ useClass: CustomBrowserXhr })
]);

ProgressService类可能如下所示:

export class ProgressService {
  progressEventObservable:Subject<any> = new Subject();
}

看到这个plunkr:http://plnkr.co/edit/8MDO2GsCGiOJd2y2XbQk?p=preview.

编辑

当您开始获取数据时,您可以显示进度条并订阅progressEventObservable observable.后者将允许您更新进度条.当请求完成(在地图或订阅回调中)时,您可以关闭进度条.

这是一个示例:

fetchData() {
  // Display progress bar
  // ...

  let subscription = this.progressService.progressEventObservable.subscribe(
    (event) => {
      // Update progress bar
      // ...
    }
  );

  return this.http.get('...')
    .map(res => {
      // Hide progress bar
      // ...

      // Unsubscribe
      subscription.unsubscribe();

      return res.json();
    });
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读