#polymer #paper-dialog
#полимер #бумага-диалог
Вопрос:
Я пытаюсь использовать тег ‘paper-dialog’ для Polymer 2 в веб-компоненте.
Я пытаюсь определить, когда пользователь нажимает кнопку «Отмена», а не кнопку «Сохранить» / «ок».
В документации сказано создать событие для ‘iron-overlay-closed’, чтобы определить, когда нажата кнопка OK / Save.
Моя проблема в том, что ‘iron-overlay-closed’ срабатывает, даже когда я нажимаю кнопку отмены.
Из моего чтения документации только кнопка с атрибутом dialog-confirm должна вызывать событие.
<paper-dialog modal backdrdop id="dialog">
<h2>Select Time</h2>
<paper-dialog-scrollable>
<div slot="body">
<p>Body is here</p>
</div>
</paper-dialog-scrollable>
<div id="dialog-buttons">
<paper-button dialog-dismiss>Cancel</paper-button>
<paper-button dialog-confirm autofocus>Save</paper-button>
</div>
</paper-dialog>
Приведенный ниже открытый метод добавляет прослушиватель.
Затем метод fireCallback закрывается независимо от того, нажимаю ли я Сохранить или Отменить.
open()
{
this.$.dialog.addEventListener('iron-overlay-closed', ()=> {this.fireCallback()});
this.$.dialog.open();
}
fireCallback()
{
console.log("closing");
}
Ответ №1:
Если вы явно определяете метод on-click для обеих кнопок, то вы понимаете, какая кнопка нажата ;
<div class="buttons">
<paper-button dialog-dismiss on-tap="_cancelled">Cancel</paper-button>
<paper-button dialog-confirm autofocus on-tap="_confirmed">OK</paper-button>
</div>
В скрипте:
_cancelled(){
console.log('Cancelled');
}
_confirmed(){
console.log('Confirmed');
}
Редактировать
Как прокомментировал @Brett Sutton, при закрытии paper-dialog
, iron-overlay-closed
произошло событие;
<paper-dialog id="scrolling" on-iron-overlay-closed="_myClosedFunction">
в скрипте;
_myClosedFunction(c){
console.log('Closed as ', c.detail); // canceled: false, confirmed: true
}
Комментарии:
1. Я использую класс, поэтому его методы-члены не являются глобальными. Я также читал, что использование атрибутов ‘on-click’ является плохой практикой и что мы должны использовать addEventListener.
2. @BrettSutton, пожалуйста, проверьте отредактированную часть, соответствует ли она вашим потребностям или нет
Ответ №2:
@HakanC ваш пример подводит меня к ответу.
Проблема заключалась в том, что мне не хватало импорта для:
<link href="../../../bower_components/iron-overlay-behavior/iron-overlay-behavior.html" rel="import">
Без импорта мой addEventListener всегда запускался, но поле «подтверждено» в объекте details, которое возвращалось с событием, всегда было false.
Итак, мои две проблемы были: 1) я не понимал, что мне не хватает импорта 2) ожидал, что событие будет срабатывать только при нажатии кнопки сохранить — оно срабатывает для отмены и сохранения, и вам нужно проверить поле «подтверждено», чтобы увидеть, какая кнопка была фактически нажата.
Итак, заключительный диалог был:
<link rel="import" href="../../../bower_components/polymer/polymer.html">
<link rel="import" href="../../../bower_components/paper-dialog/paper-dialog.html">
<link href="../../../bower_components/iron-overlay-behavior/iron-overlay-behavior.html" rel="import">
<dom-module id="dialog-test">
<template>
<style include="shared-styles">
:host {
display: block;
margin: 5px;
height: 100%;
}
paper-dialog {
width: 100%;
margin: 0px;
}
#dialog-buttons {
display: flex;
justify-content: space-between;
}
</style>
<paper-dialog modal backdrdop id="dialog">
<h2>Select Time</h2>
<paper-dialog-scrollable>
<div slot="body">
<p>Body is here</p>
</div>
</paper-dialog-scrollable>
<div id="dialog-buttons">
<paper-button dialog-dismiss>Cancel</paper-button>
<paper-button dialog-confirm autofocus>Save</paper-button>
</div>
</paper-dialog>
</template>
<script>
class DialogTest extends Polymer.Element {
static get is() {
return 'dialog-test';
}
static get properties() {
return {
};
}
open()
{
this.$.dialog.addEventListener('iron-overlay-closed', (e)=> {this.fireCallback(e)});
this.$.dialog.open();
}
fireCallback(e)
{
console.log(e.detail);
if (c.detail.confirmed == true)
{
console.log("saving")
}
}
connectedCallback()
{
super.connectedCallback();
this.open();
}
}
customElements.define(DialogTest.is, DialogTest);
</script> </dom-module>