Je déplace mon application d'angularjs à angular2. J'utilisais Angular Loading Bar
qui est
Une barre de chargement automatique utilisant des intercepteurs angulaires. Ça marche automatiquement, il suffit donc de l’inclure en tant que dépendance et ce sera le cas afficher automatiquement la progression de vos requêtes $ http.
J'essaie de trouver un plugin similaire dans angular2. Je suis tombé sur quelques-uns comme ng2-slim-loading-bar
mais ici je dois gérer manuellement les progrès. Pour chaque requête http, je dois démarrer manuellement la barre de progression, puis la terminer.
Donc, existe-t-il un plugin disponible qui peut faire exactement ce que Angular Loading Bar
fait dans angularjs. Ou comment puis-je modifier n'importe quel plugin existant pour se comporter de la sorte.
Vous pouvez utiliser ngx-progressbar . Il peut automatiquement afficher la barre de progression lorsqu'une requête HTTP est en cours d'exécution.
Tout ce que tu dois faire est :
1- Importer et fournir NgProgressCustomBrowserXhr
import { NgProgressCustomBrowserXhr } from 'ngx-progressbar';
@NgModule({
providers: [
// ...
{ provide: BrowserXhr, useClass: NgProgressCustomBrowserXhr } ,
],
imports: [
// ...
NgProgressModule
]
})
2- Utilisez-le comme ci-dessous dans votre modèle.
<ng-progress></ng-progress>
La progression commencera et se terminera automatiquement avec votre HTTP demandes. pas besoin d'utiliser NgProgressService pour appeler start ()/done () manuellement.
Voici ce que j'ai fait dans notre projet (Boîte à outils de migration automatisée Red Hat):
LoadingIndicatorService
.LoadingIndicatorService
SlimLoaderBarService
,complete()
est appelé.Si vous avez plusieurs requêtes pour chaque étape de navigation, cela semble assez naturel et fournit un bon UX . Si vous n'avez généralement qu'une requête, alors vous voudrez peut-être ajuster l'animation basée sur CSS (la rendre plus longue) ou utiliser start()
après tout.
Voici quelques éléments de code clés:
@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))
}
}
);
Enveloppe de service 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;
}
Pour obtenir le code complet, recherchez le projet Windup sur github.com.