关闭模式纸张对话框失败 删除不透明背景



当我的模态paper-dialog附加到my-app.html时,关闭它无法清除不透明的背景。但是当对话框附加到my-app.html页面时,背景会在关闭时被删除。

我有一个模态paper-dialog,我想在许多页面之间共享,所以我把它放在my-app.我已经放置了my-app,所以:

<iron-pages role="main" selected="[[routeData.page]]" 
attr-for-selected="name" selected-attribute="visible" 
fallback-selection="404">
<my-login name="" route="[[subroute]]"></my-login>
<my-todos name="my-todos" route="[[subroute]]"></my-todos>
...
<my-404-warning name="404"></my-404-warning>
</iron-pages>
<paper-dialog id="errorDlog" modal>
<h2>Error</h2>
<p>[[o_error]]</p>
<div class="buttons">
<paper-button dialog-confirm autofocus>Close</paper-button>
</div>
</paper-dialog>

为了使用从我的任何页面触发的自定义事件显示对话框,我按照 Polymer 的说明将我的侦听器绑定到窗口(请参阅"强制添加和删除侦听器"。使用这种技术,我从my-login打开对话框window.dispatchEvent(new CustomEvent('o_error', {detail: 'login error'}));.但是当对话被忽略时,背景仍然不透明。

但是,如果我向my-login添加一个id并在ready()调用this.$.loginForm.addEventListener('o_error', e => this._errorListener(e));中,我会从my-login打开对话框,this.dispatchEvent(...(。现在关闭对话框确实会清除不透明的背景。

所以,我有一个解决方法,但我认为我不应该addEventListener()每一页。

我找到了错误的根源和解决方案。首先,我正在使用Node.js和Express,并且(大部分(遵循Wendy Ginsberg关于结构的建议。服务器路由似乎

app.get('*', function(req, res){
  res.sendFile("index.html", {root: '.'});
});

触发两次 - 一次用于丢失的页面,一次用于 404 路由本身。iron-overlay-backdrop被覆盖,丢失的iron-overlay-backdrop似乎是对话框试图关闭的内容。(注意,我说">出现"是因为我在 DevTools 中看不到这种情况。我是根据效果猜测的(。

我的解决方案是创建一个包含我的<paper-dialog>EventListener<error-dialog>元素,并将<error-dialog>放在index.html中:

<body>
<my-app></my-app>
<error-dialog></error-dialog>
<noscript>
Please enable JavaScript to view this website.
</noscript>
</body>

现在,我可以从应用程序中的任何位置显示此对话框

let msg = ...
const dlog = document.querySelector('error-dialog');
dlog.dispatchEvent(new CustomEvent('o_error', {detail: msg, bubbles: true, composed: true}));

总的来说,我喜欢Node.js,但它带来了一些挑战。例如,如果您使用的是 Node.js & Express,请不要lazy-loadPolymer 404 页面:Node.js 控制台将显示不存在页面的 200 状态,以及 404 消息应位于的空<div>

if (active) {
this.listenToOverlayChanges();
} else {
this.unlistenOverlayChanges();
}

最新更新