【发布时间】:2020-01-06 07:46:08
【问题描述】:
当我们要使用 Shadow Dom 创建一个 自定义单选按钮 作为 Web 组件时,问题就出现了。
通常当我们使用单选按钮时,我们通常给分组的单选框起相同的名称,像这样。
<input type="radio" name="size" id="small" value="small">
<input type="radio" name="size" id="large" value="large">
但是如果我们定义一些自定义元素(比如我们说 cus-radio)-> 我们会以将名称和 id 作为输入(来自父级)并将它们放置在自定义元素中的方式来做。这将在正常情况下完美运行。
但我的问题在于影子 dom!当我们在 shadow dom 中创建元素时,它内部的属性可以访问或与外部 dom(主 dom)连接。那么,如果它的 name 和 id 属性在父 dom 中不可访问或不常见,我们如何开发自定义单选按钮?
例子:-
我们将像这样开发我们的自定义元素(角度元素中的伪代码)
radio.html:-
<input type="radio" [name]="name" [id]="id" ...>
TS/逻辑文件:-
...
component cus-radio {
@Input() name: string;
@Input() id: string;
...
无论我们在哪里使用它:-
<cus-radio [id]="'small'" [name]="'size'" value="small">
<cus-radio [id]="'large'" [name]="'size'" value="large">
预期的行为应该是(就像在正常 dom 中发生的那样),这两个无线电输入必须相互关联并存在于两个相互理解的情况下不。因为那些 name 和 id 在没有引用父 dom(主 dom)的影子 dom 中被更改。
我们如何才能在 shadow dom 中实际创建无线电输入?
【问题讨论】:
-
您能否提供一个实际重现问题的minimal reproducible example?
-
FWIW 我试图查看我的自定义元素是否可以扩展 HTMLInputElement(或类似的东西),但在尝试让它工作一段时间后我放弃了。如果我需要解决这个问题,而不是每个收音机的额外输入元素(正如 Emiel 的回答所建议的那样),我可能会选择一个自定义 radiogroup 元素,它能够人为地管理我的自定义收音机元素(所以我只需要一个额外的包装器元素)。还是觉得很老套。
标签: javascript web-component shadow-dom custom-element angular-elements