<paper-dialog> 过早发生开火事件
Event for opened fires too soon in <paper-dialog>
我正在使用 显示我将以编程方式构建的 SVG 图像。在开始之前,我需要知道渲染容器的大小。我正在等待打开的 属性 更改为 true ,但这显然太早了,因为 .clientWidth 在触发时为 0,但后来 .clientWidth 确实提供了正确的值。
<paper-dialog class="dialog" opened={{modalOpen}} modal>
<svg width="100%", height="100%" />
</paper-dialog>
如何等待计算 SVG clientWidth 和 clientHeight?
有时 JS 事件会在 DOM 有时间完成处理之前触发,这里似乎就是这种情况。
为了解决这个问题(或者至少提供有关正在发生的事情的额外线索),尝试将您的代码(对于 clientWidth
属性)放在 setTimeout()
函数中并给出它是零 (0) 毫秒超时。这将简单地将您的代码移动到 JS 执行堆栈的末尾,它应该仅在 DOM 完成更新后处理......随后在 DOM 元素的大小和定位属性可用时处理。
这是一个例子...
modalOpen() {
setTimeout( () => {
/* Your code here... for example... */
const paperDialog = document.getElementsByTagName("paper-dialog")[0];
console.log("paperDialog width = ", paperDialog.clientWidth);
}, 0); /* 0 milliseconds = Execute immediately after everything else processes. */
}
警告: 使用 setTimeout()
通常是不受欢迎的,因为它不完全遵守异步开发并且会产生意想不到的结果(例如触发得太早或不触发尽快开火)。虽然这种方法很快并且在某些时候可以很好地工作,但触发和处理事件通常是解决这些时序问题的最佳方法。
Polymer 的 <paper-dialog>
实现 iron-resizable-behavior 因此我们可以监听 iron-resize
事件:
disconnectedCallback() {
super.disconnectedCallback();
this.removeEventListener('iron-resize', this.onIronResize);
}
我正在使用
<paper-dialog class="dialog" opened={{modalOpen}} modal>
<svg width="100%", height="100%" />
</paper-dialog>
如何等待计算 SVG clientWidth 和 clientHeight?
有时 JS 事件会在 DOM 有时间完成处理之前触发,这里似乎就是这种情况。
为了解决这个问题(或者至少提供有关正在发生的事情的额外线索),尝试将您的代码(对于 clientWidth
属性)放在 setTimeout()
函数中并给出它是零 (0) 毫秒超时。这将简单地将您的代码移动到 JS 执行堆栈的末尾,它应该仅在 DOM 完成更新后处理......随后在 DOM 元素的大小和定位属性可用时处理。
这是一个例子...
modalOpen() {
setTimeout( () => {
/* Your code here... for example... */
const paperDialog = document.getElementsByTagName("paper-dialog")[0];
console.log("paperDialog width = ", paperDialog.clientWidth);
}, 0); /* 0 milliseconds = Execute immediately after everything else processes. */
}
警告: 使用 setTimeout()
通常是不受欢迎的,因为它不完全遵守异步开发并且会产生意想不到的结果(例如触发得太早或不触发尽快开火)。虽然这种方法很快并且在某些时候可以很好地工作,但触发和处理事件通常是解决这些时序问题的最佳方法。
Polymer 的 <paper-dialog>
实现 iron-resizable-behavior 因此我们可以监听 iron-resize
事件:
disconnectedCallback() {
super.disconnectedCallback();
this.removeEventListener('iron-resize', this.onIronResize);
}