per ottenere questa cosa in angular ho usato una GUARD:
codice:
import {Injectable} from '@angular/core';
import {CanDeactivate} from '@angular/router';
import {Observable} from "rxjs";
export interface ComponentCanDeactivate {
canDeactivate: () => boolean | Observable<boolean>;
}
@Injectable()
export class FormGuard implements CanDeactivate<ComponentCanDeactivate> {
canDeactivate(component: ComponentCanDeactivate): boolean | Observable<boolean> {
if (!component.canDeactivate()) {
return confirm('I dati non sono stati salvati, sei sicuro di voler uscire?');
}
return true;
}
}
l'interfaccia server per poter passare il componente attuale senza cablarlo direttamente nella guard:
codice:
........
@Component({
selector: 'app-mostra',
templateUrl: './mostra.component.html',
styleUrls: ['./mostra.component.scss'],
})
export class MostraComponent implements OnInit, ComponentCanDeactivate {
frm: FormGroup;
constructor(
........
) {}
ngOnInit(): void {
...............
this.initForm();
}
initForm(): void {
this.frm = new FormGroup({
id: new FormControl(this.item.id),
titolo: new FormControl(this.item.titolo, Validators.required),
sede: new FormControl(this.item.sede, Validators.required),
data_inizio: new FormControl(this.item.data_inizio, Validators.required),
data_fine: new FormControl(this.item.data_fine, Validators.required),
note: new FormControl(this.item.note),
});
}
...........
canDeactivate(): boolean | Observable<boolean> {
return !this.frm.dirty;
}
}
nel module dovete attivare la guarda; ad esempio:
codice:
.............
@NgModule({
providers: [
FormGuard
],
declarations: [
MostraComponent,
],
imports: [
CommonModule,
RouterModule.forChild([
{
path: 'mostra',
component: MostraComponent,
data: {title: 'Mostra'},
canDeactivate: [FormGuard],
},
]),
.............
]
})
export class MostreModule {
}