De todos os componentes do Angular Materials, o MatDialog pode ser o mais complexo. Ao mesmo tempo, provavelmente também é o mais versátil do grupo. Parte do motivo é que ele não é um componente, mas sim um serviço que pode ser utilizado para abrir diálogos modais com estilo e animações do Materials Design. Neste tutorial, substituiremos o diálogo de confirmação JavaScript padrão que implementamos no Prevenção de perda de dados em aplicativos angulares usando um CanDeactivate Route Guard tutorial com um MatDialog:
Caixa de diálogo de confirmação do JavaScript


Angular Confirmar Diálogo


Adicionando MatDialog ao arquivo do módulo de materials
Lembre-se de que colocamos todas as nossas importações de materiais angulares no módulos compartilhados srcapps
import {MatDialogModule} from '@angular/materials/dialog';
const materialModules = (
//...
MatToolbarModule,
MatDialogModule
);
Criando o componente ConfirmDialog
Parte do que torna o MatDialog tão versátil é que seu método open() aceita um componente para mostrar no corpo do diálogo. Você pode ficar tentado a criar o componente como um filho daquele que o chamará, mas pode ser sensato pensar duas vezes antes de fazer isso, pois podemos gostar de reutilizar o mesmo diálogo em outros lugares dentro do nosso aplicativo no futuro. Por esse motivo, eu recomendaria gerá-lo dentro do diretório do aplicativo:
ng g c confirm-dialog
No arquivo confirm-dialog.element.ts, modificaremos o construtor para aceitar uma referência ao diálogo, bem como os dados que passaremos a ele:
import { Element, Inject, ViewEncapsulation } from '@angular/core';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/materials/dialog';
@Element({
selector: 'app-confirm-dialog',
templateUrl: './confirm-dialog.element. html',
styleUrls: ('./confirm-dialog.element. css'),
// it will permit us to override the mat-dialog-container CSS class
encapsulation: ViewEncapsulation.None
})
export class ConfirmDialogComponent {
constructor(
public dialogRef: MatDialogRef< ConfirmDialogComponent>,
@Inject(MAT_DIALOG_DATA) public knowledge: any)
{ }
}
Em seguida, adicionaremos o conteúdo da caixa de diálogo ao arquivo confirm-dialog.element.html:
{{knowledge.dialogMessageLine1}}
{{knowledge.dialogMessageLine2}}p>
Invocando o serviço MatDialog
De volta ao arquivo survey.element.ts, estamos prontos para atualizar o método canExit() para apresentar nosso diálogo personalizado em vez do diálogo de confirmação nativo do JavaScript. Há três coisas que precisamos fazer para que isso aconteça:
- Adicione um construtor que aceite uma referência MatDialog.
- Adicione o método openUnsavedChangesDialog(). Ele é responsável por mostrar o diálogo.
- Invoque o método openUnsavedChangesDialog() de canExit().
Aqui está o código-fonte atualizado para o arquivo survey.element.ts que mostra as alterações relevantes:
// imports
import { MatDialog } from "@angular/materials/dialog";
import { ConfirmDialogComponent } from "../confirm-dialog/confirm- dialog.element";
// SatisfactionRatings enum
@Element({
selector: "app-survey",
templateUrl: "./survey.element.html",
styleUrls: ("./survey.element.css")
})
export class SurveyComponent implements IDeactivateComponent {
// declarations
constructor(public dialog: MatDialog) { }
//strategies...
public canExit(): boolean | Observable {
return this.ngFormRef.soiled
? this.openUnsavedChangesDialog( )
: true;
};
non-public openUnsavedChangesDialog(): Observable {
const dialogRef = this.dialog.open( ConfirmDialogComponent, {
width: '26.5rem',
knowledge: {
dialogTitle: 'Unsaved Modifications',
dialogMessageLine1: 'You might have unsaved modifications.',
dialogMessageLine2: 'Are you certain you need to depart the web page?',
yesButtonText: 'Depart this Web page',
noButtonText: 'Keep on this Web page'
}
});
return dialogRef.afterClosed();
}
}
O método openUnsavedChangesDialog() explicado
Há muita coisa acontecendo nesse pequeno método, então vamos destrinchar.
A referência de diálogo que injetamos por meio do construtor fornece vários métodos, propriedades e ganchos de eventos para trabalhar com ela, sendo o mais importante o método open(). Ele aceita o componente para exibir, bem como um objeto MatDialogConfig. É onde definimos a aparência do diálogo e passamos o objeto de dados que preenche o componente de diálogo.
As organizações devem ir além de uma abordagem fragmentada para redes e segurança. Uma plataforma ampla, integrada e automatizada que proteja todas as bordas aborda os desafios agora e no futuro.
O gancho de evento afterClosed() recebe um observable que é notificado quando o diálogo termina de fechar. Podemos fazer qualquer processamento que precisamos fazer depois que o diálogo é fechado. No nosso caso, não precisamos fazer nada além de passar o valor retornado pelo diálogo. Isso é definido pelos dois botões no rodapé por meio do atributo sure (mat-dialog-close):
Precisamos então adicionar o Observable
Aqui está o resultado remaining das atualizações de hoje para o Prevenção de perda de dados em aplicativos angulares usando um CanDeactivate Route Guard demo. Para testá-lo, navegue até a página Survey, interaja com o formulário para atualizar o modelo subjacente e, em seguida, clique no hyperlink House:
Conclusão
Neste tutorial, aprendemos como usar o MatDialog, o componente Angular Materials mais complexo e, ainda assim, mais versátil. Para fazer isso, substituímos o diálogo de confirmação JavaScript padrão que implementamos no Prevenção de perda de dados em aplicativos angulares usando um CanDeactivate Route Guard demonstração com um MatDialog.