【问题标题】:Show loading bar for every http request angular2显示每个http请求的加载栏
【发布时间】:2017-10-14 02:13:50
【问题描述】:

我正在将我的应用程序从 angularjs 移动到 angular2。我使用的是Angular Loading Bar

使用角度拦截器的自动加载栏。有用 自动,因此只需将其作为依赖项包含在内,它就会 自动显示您的 $http 请求的进度。

More info

我正在尝试在 angular2 中找到类似的插件。我遇到了一些像ng2-slim-loading-bar 这样的人,但在这里我必须手动管理进度。对于每个 http 请求,我必须手动启动进度条然后完成它。

那么,是否有任何现有的插件可以完全完成 Angular Loading Bar 在 angularjs 中所做的事情。或者我怎样才能修改任何现有的插件以使其具有这样的行为。

【问题讨论】:

    标签: angular progress-bar loading angular-http-interceptors


    【解决方案1】:

    检查@ngx-loading-bar,它会自动为Http调用和路由添加进度条

    https://github.com/aitboudad/ngx-loading-bar

    【讨论】:

      【解决方案2】:

      这是我在我们的项目(红帽自动迁移工具包)中所做的:

      • 在我们的 HTTP 服务包装器(处理 OAuth)中,我们触发一个事件,
      • 然后被我们的LoadingIndicatorService 捕获。
      • LoadingIndicatorService
        • 包装SlimLoaderBarService
        • 并跟踪正在进行的 HTTP 请求数量。
        • 然后它计算百分比并将其设置为 20 到 90 % 的比例。
        • 当所有 HTTP 请求完成后,它会在 90% 处停留大约一秒钟,然后调用 complete()

      如果您对每个导航步骤有多个请求,这看起来很自然并且提供了良好的用户体验。 如果您通常只有 1 个请求,那么您可能需要调整基于 CSS 的动画(使其更长)或使用start()

      以下是一些关键代码部分:

      @Injectable()
      export class LoadingIndicatorService {
      
          constructor(
              private _slimBarService: SlimLoadingBarService,
              private _eventBusService: EventBusService,
          ) {
              // Register the LoadingSomething event listeners.
              this._eventBusService.onEvent
                  .filter(event => event.isTypeOf(LoadingSomethingStartedEvent))
                  .subscribe((event: LoadingSomethingStartedEvent) => this.loadingStarted() )
              this._eventBusService.onEvent
                  .filter(event => event.isTypeOf(LoadingSomethingFinishedEvent))
                  .subscribe((event: LoadingSomethingFinishedEvent) => this.loadingFinished() )
          }
      
          public getSlimService(){
              return this._slimBarService;
          }
      
      
          private counter: number = 0;
          private max: number = void 0;
      
          private reset() {
              this.counter = 0;
              this.max = void 0;
          }
      
          public loadingStarted(){
              this.counter++;
              this.max = this.counter;
              this.updateProgress();
          }
      
          public loadingFinished(){
              this.counter--;
              this.updateProgress();
          }
      
          private updateProgress() {
              if (this.counter == 0) {
                  this._slimBarService.height = "2px";
                  this._slimBarService.visible = true;
                  this._slimBarService.progress = 95;
                  this.max = void 0;
                  Observable.timer(700).subscribe(() => {
                      this._slimBarService.complete();
                  });
              }
              else {
                  // max - counter = finished.
                  // If the things to load are added after something loaded, the progress would go back.
                  // But let's rely on that loading will start fast at the beginning.
                  // Start at 20, jump to 90.
                  let percent = 20 + 70 * (1 - (this.max - this.counter) / this.max);
                  this._slimBarService.height = "3px";
                  this._slimBarService.color = "#39a5dc";
                  this._slimBarService.visible = true;
                  this._slimBarService.progress = percent;
              }
          }
      
      }
      
      
          let responseObservable2 = responseObservable.do(
              () => console.log("Request SUCCEEDED"),
              () => console.log("Request FAILED"),
              () => {
                  console.log("Request FINISHED");
                  if (this._eventBus) {
                      console.log("Request FINISHED, firing");
                      this._eventBus.fireEvent(new LoadingSomethingFinishedEvent(responseObservable))
                  }
              }
          );
      

      HTTP 服务包装器:

      @Injectable()
      export class WindupHttpService extends Http {
      
          private configureRequest(method: RequestMethod, f: Function, url: string | Request, options: RequestOptionsArgs = {}, body?: any): Observable<Response> {
              let responseObservable: Observable<Response> = ...
      
          ...
      
          console.log("Load STARTED");
          if (this._eventBus)
              console.log("Load STARTED, firing");
          this._eventBus.fireEvent(new LoadingSomethingStartedEvent(responseObservable));
      
          return responseObservable2;
      }
      

      如需完整代码,请在 github.com 中搜索项目 Windup。

      【讨论】:

        【解决方案3】:

        您可以使用ngx-progressbar。它可以automatically 在 HTTP 请求运行时显示进度条。

        你所要做的就是:

        1- 导入并提供NgProgressCustomBrowserXhr

        import { NgProgressCustomBrowserXhr } from 'ngx-progressbar';
        
        @NgModule({
         providers: [
           // ...
           { provide: BrowserXhr, useClass: NgProgressCustomBrowserXhr } ,
         ],
         imports: [
           // ...
           NgProgressModule
         ]
        })
        

        2- 在您的模板中使用它,如下所示。

        <ng-progress></ng-progress>
        

        进度将通过您的 HTTP 自动开始和完成 要求。无需使用 NgProgressService 调用 start()/done() 手动。

        【讨论】:

        • 我收到错误.. 找不到名称 NgProgressModule 我正在为我的应用程序使用 angular-cli.. 我已经安装了包并在 angular-cli.json 下的脚本标签下添加了这个。我错过了什么吗?
        • 我已经修复了以前的问题.. 现在出现此错误:我收到错误.. 未捕获的类型错误:无法读取未定义的属性“核心”不确定我在哪里失踪。
        • (addScript.js:9),
        • 即使progess baar显示..我看到前面提到的错误..我会尝试调试它
        • 可以,你所有的页面都会显示进度条
        猜你喜欢
        • 2018-01-01
        • 2018-01-07
        • 2016-11-03
        • 2023-03-08
        • 2017-01-04
        • 2012-12-19
        • 1970-01-01
        • 2017-01-06
        • 1970-01-01
        相关资源
        最近更新 更多