Comment afficher Spinner Angular 2 Material Progress comme une superposition quelque peu transparente de la vue actuelle (une page ou une boîte de dialogue modale)?
J'ai été inspiré par: Remplacer Angular Taille du matériau et style du conteneur md-dialog-container
Je l'ai résolu comme ça:
Créer un nouveau composant ProgressSpinnerDialogComponent
Le contenu de progress-spinner-dialog.component.html:
<mat-spinner></mat-spinner>
Le contenu de progress-spinner-dialog.component.ts:
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-progress-spinner-dialog',
templateUrl: './progress-spinner-dialog.component.html',
styleUrls: ['./progress-spinner-dialog.component.css']
})
export class ProgressSpinnerDialogComponent implements OnInit {
constructor() { }
ngOnInit() {
}
}
Dans styles.css, ajoutez:
.transparent .mat-dialog-container {
box-shadow: none;
background: rgba(0, 0, 0, 0.0);
}
Voici un exemple d'utilisation de spinner progress:
import { Component, OnInit } from '@angular/core';
import { MatDialog, MatDialogRef } from "@angular/material";
import { Observable } from "rxjs";
import { ProgressSpinnerDialogComponent } from "/path/to/progress-spinner-dialog.component";
@Component({
selector: 'app-use-progress-spinner-component',
templateUrl: './use-progress-spinner-component.html',
styleUrls: ['./use-progress-spinner-component.css']
})
export class UseProgressSpinnerComponent implements OnInit {
constructor(
private dialog: MatDialog
) {
let observable = new Observable(this.myObservable);
this.showProgressSpinnerUntilExecuted(observable);
}
ngOnInit() {
}
myObservable(observer) {
setTimeout(() => {
observer.next("done waiting for 5 sec");
observer.complete();
}, 5000);
}
showProgressSpinnerUntilExecuted(observable: Observable<Object>) {
let dialogRef: MatDialogRef<ProgressSpinnerDialogComponent> = this.dialog.open(ProgressSpinnerDialogComponent, {
panelClass: 'transparent',
disableClose: true
});
let subscription = observable.subscribe(
(response: any) => {
subscription.unsubscribe();
//handle response
console.log(response);
dialogRef.close();
},
(error) => {
subscription.unsubscribe();
//handle error
dialogRef.close();
}
);
}
}
Ajoutez-le à l'app.module
declarations: [...,ProgressSpinnerDialogComponent,...],
entryComponents: [ProgressSpinnerDialogComponent],
Utilisez le code ci-dessous pour obtenir l'opaque
HTML
<div style="height:800px" [class.ops]="show">
<h2 [class.opaque]="trans">{{name}}</h2>
<button class="btn btn-success" (click)="toggleSpinner()"> See spinner </button>
</div>
<spinner [show]="show" [size]="150"> </spinner>
COMPOSANT
import { Component, Input } from '@angular/core';
@Component({
selector: 'spinner',
template: `
<div *ngIf="show">
<span>
<i class="fa fa-spinner fa-spin" [ngStyle]="{'font-size': size+'px'}" aria-hidden="true"></i>
</span>
</div>
`
})
export class SpinnerComponent {
@Input() size: number = 50;
@Input() show: boolean;
toggleSpinner() {
this.show = !this.show;
this.trans=!this.trans;
}
}
CSS
.ops {
opacity :0;
}
Basé sur Une approche un peu différente: Deux composants, le premier pour ouvrir le dialogue, le second est le dialogue. Dans le composant que vous voulez montrer au disque, ajoutez simplement:
<app-dialog-spinner *ngIf="progressSpinner"></app-dialog-spinner>
Et contrôlez le * ngIf dans votre logique. Ci-dessus, tout ce dont vous avez besoin pour appeler la centrifugeuse pour que le composant reste beau et propre.
Composant spinner de dialogue:
import { Component, OnInit, OnDestroy } from '@angular/core';
import { MatDialog, MatDialogRef } from '@angular/material';
// Requires a transparent css (panel)id in a parent stylesheet e.g.:
// #DialogSpinnerComponent {
// box-shadow: none !important;
// background: transparent !important;
// }
@Component({
selector: 'app-do-not-use',
template: `<mat-spinner></mat-spinner>`,
styles: []
})
export class DialogSpinnerDialogComponent { }
@Component({
selector: 'app-dialog-spinner',
template: ``,
styles: []
})
export class DialogSpinnerComponent implements OnInit, OnDestroy {
private dialog: MatDialogRef<DialogSpinnerDialogComponent>;
constructor(
private matDialog: MatDialog,
) { }
ngOnInit() {
setTimeout(() => {
this.dialog = this.matDialog.open(DialogSpinnerDialogComponent, { id: 'DialogSpinnerComponent', disableClose: true });
});
}
ngOnDestroy() {
setTimeout(() => {
this.dialog.close();
});
}
}
Déclarez les composants dans votre module et bien sûr enregistrez DialogSpinnerDialogComponent
dans vos entryComponents. Ajoutez les propriétés css à une feuille de style parent. Cela peut probablement être amélioré mais je suis un peu pressé par le temps.