【发布时间】:2017-11-26 16:15:12
【问题描述】:
我最近遇到了以下情况,正在寻找一个非常棘手的不当行为的建议/优雅的解决方案,恕我直言。
假设我在文件bible-reference.js 中创建了以下自定义元素定义:
class BibleReference extends HTMLElement {
constructor() {
super();
}
get value() { return this._value; }
set value(newValue) { this._value = newValue; }
}
customElements.define('bible-reference', BibleReference);
我们已经定义了我们的新元素,并且我们有一个value 属性getter/setter 来与这个元素的值进行交互。请注意,getter/setter 将在元素的 prototype 对象上找到,这本身是可以肯定的。
现在,让我们回顾一下我遇到的以下 HTML 布局:
<bible-reference id='elem-1'></bible-reference>
<script src="starter.js"></script>
<script src="bible-reference.js"></bible-reference>
诀窍在于starter.js 内容。如果这个脚本包含下面的代码,事情就会被破坏:
let br = document.getElementById('elem-1');
br.value = 'some value';
value 设置在 non-upgraded 元素上,因此调用的不是 getter/setter,而只是向元素添加了一个新属性。在对象本身上设置此属性,即使在升级完成后,value 的 getter/setter 也不再可访问 用于 this 元素实例,因为存在在到达原型之前有一个(覆盖的)value 属性可用。
我同时通过在构造函数中添加 delete this.value; 解决了这个问题,但是......真是个 hack!
感谢任何见解。
【问题讨论】:
-
这是一个黑客,但它是一个好的和合法的,那么问题出在哪里?您可以在删除属性之前添加一个条件,并可能将
value的值复制到this._value -
我正在考虑任何意外(在我与 CE 合作了很长一段时间后,这发生在我身上,也许这次我不够敏锐 :) 和不可预测的(想想另一个贡献者添加了一些应用程序初始化周期中的脚本甚至没有意识到可能会破坏事物)-本质上是不好的,必须改进
-
啊,我认为为任何自定义属性添加这样的
delete逻辑,以防万一,这是荒谬的,但将是不可避免的,因为这些属性甚至可以被第三方/第二方访问,在这种情况下,我自己的 MVVC 库发生在我身上
标签: javascript dom custom-element