Angular 10 ГБ — индикатор выполнения не отображается

#angular #typescript #ng-bootstrap

#angular #typescript #ng-bootstrap

Вопрос:

У меня есть проект Angular 10, использующий загрузочный ngb-progressbar. Я написал сервис, который я могу использовать во всем своем приложении, чтобы показывать и скрывать индикатор выполнения по мере необходимости. Он отображается во время начальной загрузки приложения, но не в любое другое время, когда я его вызываю.

Все компилируется и работает нормально, и никаких ошибок в консоли не видно. Я попытался показать весь соответствующий код.

progress-bar.component.html

Примечание: если я удалю *ngIf=»загрузка» отсюда, индикатор выполнения отображается на каждой странице. Так что я думаю, что с моей загрузкой все в порядке.

 <div id="content-loading" class="overlay" *ngIf="loading">
    <div class="progress">
        <ngb-progressbar value="1000" style="width: 100%">Loading</ngb-progressbar>
    </div>
</div>
  

progress-bar.component.ts

 import { Component } from '@angular/core';
import { NgbProgressbarConfig } from '@ng-bootstrap/ng-bootstrap';
import { ProgressBarService } from './progress-bar.service';

@Component({
    selector: 'ngbd-progressbar',
    templateUrl: './progress-bar.component.html',
    providers: [NgbProgressbarConfig],
    //moduleId: module.id
})

export class ProgressBarComponent  {
    public loading: boolean;

    constructor(config: NgbProgressbarConfig, progressBar: ProgressBarService) {
        config.max = 1000;
        config.striped = true;
        config.animated = true;
        config.type = 'primary';

        progressBar.status.subscribe((status: boolean) => {
            this.loading = status;
        });
    }
}
  

progress-bar.service.ts

 import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';

@Injectable()
export class ProgressBarService {
    private _loading: boolean = false;

    public status: Subject<boolean> = new Subject();

    constructor() {

    }

    public get loading(): boolean {
        return this._loading;
    }

    public set loading(v: boolean) {
        this._loading = v;
        this.status.next(v);
    }

    public start(): void {
        this.loading = true;
    }

    public stop(): void {
        this.loading = false;
    }
}
  

Он экспортируется из общего компонента

shared.component.ts

 export * from './progress-bar/progress-bar.component';
  

shared.service.ts

 export * from './progress-bar/progress-bar.service';
  

And imported into the app.module

app.module

 import { ProgressBarComponent } from './shared/shared.component';
import { ProgressBarService } from './shared/shared.service';
...
declarations: [
ProgressBarComponent,
]
providers: [
ProgressBarService,
]

  

And put in the app component html

app.component.html

 <div id="page-content-wrapper">
            <div class="container-fluid">
                <div class="row">
                    <div class="col-lg-12">
                        <breadcrumb></breadcrumb>
                        <ngbd-progressbar></ngbd-progressbar> 
                    </div>
                    <div class="col-lg-12">
                        <router-outlet></router-outlet>
                    </div>
                </div>
            </div>
        </div>
  

Что касается использования в компоненте, оно предполагает использование базового компонента

base.component.ts

 import { ProgressBarService } from '../progress-bar/progress-bar.service';
...
export class BaseComponent {
    protected _progressBarService: ProgressBarService;

    constructor(
        progressBarService: ProgressBarService,
        toastr: ToastrService) {
            
            this._progressBarService = progressBarService;
            this._toastr = toastr;
         }


}
  

И затем использование в компоненте выглядит следующим образом. Поведение — это просто отсутствие наложения индикатора выполнения.

регистр-index.component.ts

 import { BaseComponent } from '../../shared/ui/base.component';
import { ProgressBarService } from '../../shared/progress-bar/progress-bar.service';
...
export class CaseIndexComponent extends BaseComponent implements OnInit {

constructor(
      progressBarService: ProgressBarService,
) { super(progressBarService, toastr); }
...
search(e: any): void {
this._progressBarService.start();
      this._caseService.getByCriteria(criteria)
          .subscribe(c => this.searchSuccess(c),
              error => this.displayError(error));
}
...
searchSuccess(cases: Case[]): void {
      this.cases = cases;
      this._progressBarService.stop();

      if (this.cases.length == 0) {
          this._toastr.info('No Search Results');
      }
  }
  

Спасибо за чтение.

Комментарии:

1. Это слишком много кода. Пожалуйста, сузьте его. Попробуйте удалить код и продемонстрировать проблему в JSFiddle или около того.

2. Я не вижу импортированного модуля для индикатора выполнения в вашем модуле приложения. Без этого он будет просто обрабатываться как «обычный» html.

3. Извините за объем кода. Это нелегко продемонстрировать. И да, у меня есть ProgressBarComponent в объявлениях app.module. Я отредактирую свой вопрос.

4. добавьте некоторый вход в progressBar.status.subscribe((status: boolean) => { console.log('status fired', status); .... систему из progress-bar.component.ts и подтвердите его

5. интересные результаты jd_7. Я вижу «статус запущен верно» и «статус запущен ложно» при маршрутизации на страницу. Однако нет сообщений о длительном процессе.