2016-07-18 3 views
1

В настоящее время у меня есть $mdDialog, который при открытии является полной страницей и имеет форму внутри него. Когда пользователь нажимает отменить $mdDialog закрывается вызовом этой функции

$mdDialog.cancel(); 

Однако, я хочу также закрыть $mdDialog, когда пользователь нажимает браузеры кнопку назад, это то, что я ищу, чтобы сделать

backButtonWasClicked = function() } 
    $mdDialog.cancel(); 
} 

Как это можно сделать? Я думал о том, чтобы помещать хэш в URL-адрес, когда $mdDialog показывает как mywebsite.com/page#dialog, а затем как-то, когда пользователь нажимает кнопку «Назад», он может видеть этот хеш, закрывать диалог и удалять хэш. Я не уверен, что это лучший способ.

Можно ли это сделать?

+0

Возможный дубликат [Материал AngularJS - Dialog Close Использование телефона «назад») (http://stackoverflow.com/questions/28594555/angularjs-material-dialog-close-using-phone-back-button) – Blizwire

+0

@ Blizwire этот пост не имеет ничего общего с мобильным телефоном. Кроме того, предоставленные решения для вашего вопроса не решают проблему, с которой я столкнулся. –

+0

ответ на связанный вопрос является агностиком платформы. Работает одинаково независимо от того, нажимает ли пользователь физическую кнопку «Назад» на своем устройстве или кнопку «Назад» браузера. Проблема может быть решена таким же образом, слушая событие изменения состояния corcope и запуская метод отмены. – Blizwire

ответ

2

Я нашел решение для всех, кто захочет получить такую ​​же функциональность.

Это код, который создает мой $mdDialog

$scope.showOrderFormOverlay = function (ev) { 
    $mdDialog.show({ 
     templateUrl: '/Partials/dialog.html', 
     parent: angular.element(document.body), 
     targetEvent: ev, 
     clickOutsideToClose: false, 
     escapeToClose: false, 
     fullscreen: true, 
     focusOnOpen: false, 
     onComplete: function() { 
      $('.md-dialog-container').addClass('fullscreen'); 
      $location.hash("this-can-be-whatever"); 
     } 
    }); 
}; 

Я впрыскивается $location в контроллер, который создает мой $mdDialog. Затем я добавил эту строку $location.hash("this-can-be-whatever") в функцию onComplete. Это добавляет хеш к текущему url mywebsite.com/page, поэтому после того, как вы откроете $mdDialog, это будет выглядеть так: mywebsite.com/page#this-can-be-whatever.

Тогда внутри моих $mdDialog «ы контроллер я добавил эту функцию,

window.onpopstate = function() { 
    if (window.location.hash == "") { 
     $mdDialog.cancel(); // Cancel the active dialog 
    } 
} 

Это позволит удалить хэш из URL и закройте $mdDialog.

+0

-1, так как этот ответ использует несколько хак с хешем window.location, чтобы отслеживать поведение пользователей. Уже существует встроенное событие, когда пользователь меняет состояние (например, нажав кнопку возврата к браузеру). Пожалуйста, см. Мой ответ ниже для правильного углового решения. – Blizwire

+0

@Blizwire, почему я не вижу вашего решения? – azerafati

+0

@azerafati люди проголосовали за него и удалили его, чтобы его больше не видно. В любом случае ответ был ссылкой на эту ссылку, если вы заинтересованы. https://stackoverflow.com/questions/28594555/angularjs-material-dialog-close-using-phone-back-button/34844681#34844681 – Blizwire

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