2016-11-21 8 views
0

Как предотвратить закрытие вкладки браузера, когда форма загрязнена в Угловом 2?Запретить закрытие вкладки браузера, когда форма загрязнена в Угловом 2

Мой HTML тело содержит компонент:

<body> 
    <my-app>Loading, please wait...</my-app> 
    </body> 

который содержит маршрутизатор навигации и выход маршрутизатора:

<nav> 
(...) 
</nav> 
<router-outlet></router-outlet> 

и когда маршрутизатор переходит на страницу редактирования, у меня есть некоторые формы там :

<form #myForm="ngForm"> 
    <button pButton type="text" label="Save" (click)="onSave()" [disabled]="!myForm.valid || myForm.pristine"></button> 
    </form> 

Теперь, если форма не «первозданная», я хочу попросить подтверждения, когда пользователь пытается закрыть вкладку браузера:

window.onbeforeunload = function() { 
    if (form.dirty) { 
    return "You have unsaved data changes. Are you sure to close the page?" 
    } 
} 

Как я могу получить доступ к грязному состоянию угловых форм в каноническом образе оттуда? Я могу зарегистрировать событие для изменения поля в каждом поле и установить глобальный грязный флаг, но мне нужно было бы поместить этот код на каждый из каждой навигации и после этого сохранить этот код, чтобы сообщение оставалось неизменным. Есть ли другой способ проверить, есть ли угловая форма на странице, которая находится в грязном состоянии?

ответ

0

Возможно

@HostListener('window:beforeunload', ['$event']) 
handleBeforeUnload(event) { 
    if (connected) { 
    return "You have unsaved data changes. Are you sure to close the page?" 
    } 
} 
+0

И я определяю, что @HostListener в каждом компоненте, который имеет #ngForm, который может быть загрязнен? –

+0

В любом случае, @HostListener, добавленный к моему компоненту, отображается серым (неиспользуемый код) и не вызывается при закрытии окон. –

+0

Извините, вы правы. Я забыл добавить 'window:' (см. Обновленный вопрос). Я не знаю о вашем «показанном сером». В любом случае, это не называется напрямую. –

0

Просто вы можете использовать Jquery, чтобы получить состояние из ng-form.

@HostListener('window:beforeunload', ['$event']) 
beforeUnloadHandler(event) { 
    if($('form').hasClass('ng-touched')) { //You can check with ng-dirty based on your requirements. 
     let confirmMessage = 'You have unsaved data changes. Are you sure to close the page?' 
     event.returnValue = confirmMessage; 
     return confirmMessage; 
    } 

} 

В моем случае я просто показывает предупреждение диалог, если что form была затронута.

 Смежные вопросы

  • Нет связанных вопросов^_^