当我的模态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-load
Polymer 404 页面:Node.js 控制台将显示不存在页面的 200 状态,以及 404 消息应位于的空<div>
。
if (active) {
this.listenToOverlayChanges();
} else {
this.unlistenOverlayChanges();
}