#angularjs #angular-material #ondestroy #mddialog #oncloselistener
#angularjs #angular-материал #ondestroy #mddialog #oncloselistener
Вопрос:
Я создаю почтовый ящик в angular. И мне нужно было бы сохранить черновик сообщения, когда всплывающее окно для отправки сообщения закроется.
Я знаю, что есть несколько альтернатив:
scope.$on("$destroy", function () { saveMessage() });
и:
$mdDialog.show(...).finaly(function(){ saveMessage() });
Но обоих недостаточно:
- Первое вызывается, когда диалоговое окно уже закрыто. Это связано с неприемлемыми требованиями (есть iFrame, который должен быть открыт)
- Второе находится за пределами контроллера mdDialog и возлагает ответственность на вызывающего всплывающее окно, в то время как оно должно быть в самом всплывающем окне.
Итак, я ищу способ вызвать функцию ДО того, как всплывающее окно фактически закроется. Что-то вроде scope.$on("$mdDialogBeforeClose", function () { saveMessage() });
Другим вариантом было бы перехватывать каждое событие закрытия. Кажется уродливым, но может быть решением. В этом случае мне нужно было бы прослушать escape-кнопку и щелкнуть вне всплывающего окна (хотя я мог бы отключить эту функцию)…
Есть идеи получше?
Спасибо!
Редактировать:
Дополнительный вопрос: как перехватить событие escape-нажатия клавиши? Я пытался <md-dialog aria-label="List dialog" ng-keypress="keyPress($event)">
, но это даже не сработало…
Ответ №1:
Может быть, использовать onRemoving
обратный вызов — CodePen
Из документов:
Разметка
<div ng-controller="MyController as vm" id="popupContainer" ng-cloak="" ng-app="app">
<md-button class="md-primary md-raised" ng-click="vm.open($event)">
Custom Dialog
</md-button>
<script type="text/ng-template" id="test.html">
<md-dialog aria-label="Test">
Hello!
</md-dialog>
</script>
</div>
JS
angular.module('app',['ngMaterial', 'ngMessages', 'material.svgAssetsCache'])
.controller('MyController', function($scope, $mdDialog) {
this.open = function(ev) {
$mdDialog.show(
{
templateUrl: "test.html",
clickOutsideToClose: true,
onRemoving: function (event, removePromise) {
console.log(123);
}
});
};
})
Комментарии:
1. Это имеет те же проблемы, что и во втором случае, который я описал. Мне нужно быть в контроллере модального. Мне нужно получить доступ к этой области, и я хотел бы, чтобы сам модал отвечал за сохранение сообщения при каждом закрытии (мы команда разработчиков, и есть несколько мест, где открывается диалоговое окно)
2. @ThomasStubbe Демонстрации показывают, как закрыть диалоговое окно с помощью функции в контроллере диалогового окна. Вы имеете в виду закрытие диалогового окна щелчком снаружи?
3. Демонстрация вообще не использует контроллер диалогового окна:
controller: SomeDialogController
его следует добавить в show-function. Внутри этого контроллера есть функция, которую необходимо выполнить перед закрытием.4. Это то, что я хочу, за исключением того, что функция закрытия также должна запускаться при нажатии escape или щелчке вне диалогового окна. Поэтому я хочу вызвать эту функцию закрытия в любом случае, когда диалоговое окно закрывается. Два способа сделать это я описал в своем вопросе, но они либо выходят за рамки dialogController (
finally
), либо после того, как HTML уже уничтожен (scope.$on('$destroy')
)5. @ThomasStubbe Поможет ли что-то подобное? — codepen.io/camden-kid/pen/rrzOLP?editors=1010
Ответ №2:
Диалоговое окно возвращает обещание, с помощью которого вы можете обрабатывать событие закрытия диалога
var dialogPromise = $mdDialog.show(
{
templateUrl: "test.html",
clickOutsideToClose: true,
onRemoving: function (event, removePromise) {
console.log(123);
}
});
dialogPromise.then(function(){
// hide method handler
// You can write your code here that execute after dialog close
}, function(){
});