angular - Angular 2 组件中的重复 "id"属性

标签 angular angular-components

上下文

我正在为复选框编写自定义 Angular 组件。该组件呈现一个复选框标签和一个标签标签。复选框的“id”属性和标签的“for”属性都设置为组件的id。属性(组件的 @Input)以确保单击标签将切换复选框。模板的简化版本如下所示:

<div class="checkbox">
    <input type="checkbox" [id]="id" />
    <label [for]="id"><ng-content></ng-content></label>
</div>

问题

当我在组件上设置“id”属性时(例如 <my-checkbox id="hello">Check me</my-checkbox>),DOM 中的组件包装器标签会自动设置“id”属性。这会导致 DOM 中出现重复的 id,因为我已经在组件内的复选框上设置了“id”属性。这是无效的,并且会破坏浏览器默认的通过单击标签进行切换的行为。 DOM 输出是:

<my-checkbox id=“my-checkbox” ng-reflect-id=“my-checkbox” ng-reflect-checked="true">
    <div ng-reflect-ng-class="[object Object]" class="checkbox">
        <input class="checkbox__element" type="checkbox" name="fire_missiles" ng-reflect-id=“my-checkbox” id=“my-checkbox” value=“fire_missiles” ng-reflect-checked="true">
        <label class="checkbox__label" ng-reflect-html-for=“my-checkbox” for=“my-checkbox”>
            Fire missiles?
        </label>
    </div>
</my-checkbox>

有没有办法 a) 摆脱垃圾容器标签或 b) 停止将“id”属性作为属性自动反射(reflect)到容器上?

注意:使用应用于 div 之类的属性选择器没有帮助,它只会从 <my-checkbox /> 中移动额外的“id”到 div。

最佳答案

我会简单地重命名复选框的 id(以及标签的 for 属性),这样它就不会与组件的 id 冲突,如下所示:

<input id="{{ id }}-checkbox" …>
<label for="{{ id }}-checkbox">…</label>

关于angular - Angular 2 组件中的重复 "id"属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41495995/

相关文章:

javascript - Angular2 - 限制 p 内的行数

Angular Router.navigate 使用 queryParams 导航到子路由

angular - PrimeNG 导出为 CSV

angular - 在 Angular 中,如何在不使用指令/模板的情况下插入特定的组件实例?

angular - 为什么 Angular 坚持为组件使用自定义前缀?

html - 增加 IcoFont 的高度

angular - 如何在嵌套延迟加载模块中实现 ngx 翻译(App Module->(Module 1->(Module 2)))

Angular 4 - 将对象从一个组件传递到另一个组件(无父子层次结构)

angular-components - 具有名称绑定(bind)的 Angular UpgradeComponent

javascript - Angular @Output不工作