2017-01-05 6 views
4

КонтекстаДубликат «идентификатор» атрибут в угловом 2 компоненте

Я пишу пользовательский Угловой компонент для флажка. Компонент отображает тег флажка вместе с тегом метки. Атрибут «id» флажка и атрибут «для» метки устанавливаются как свойство id компонента (@Input для компонента), чтобы гарантировать, что щелчок на ярлыке переключит этот флажок. Упрощенная версия шаблона выглядит следующим образом:

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

Проблема

Когда я установил «идентификатор» проп на моем компоненте (например, <my-checkbox id="hello">Check me</my-checkbox>), «идентификатор» атрибут автоматически устанавливается на компоненте тег обертки в DOM. Это приводит к дублированию идентификаторов в DOM, поскольку я уже устанавливаю атрибут «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> 

Есть ли способ, чтобы либо а) избавиться от мусора тега контейнера или б) остановить автоматическое отражение «ид» проп на контейнер в качестве атрибута?

ПРИМЕЧАНИЕ. Использование селектора атрибутов, применяемого к чему-то вроде div, не помогает, оно просто перемещает дополнительный «id» из <my-checkbox /> в div.

Спасибо!

+0

Почему бы вам просто не изменить флажок «id» флажка, например. '' и '

+1

Это самое чистое решение, которое я видел до сих пор, спасибо. Отправьте его как ответ, и я соглашусь. – Elliot

ответ

3

По просьбе Элиота, я отправляю мой комментарий в ответ:

Я бы просто переименовать идентификатор CheckBox (и, следовательно, атрибут лейбла for), чтобы он не конфликтует с идентификатором компонента, например, так:

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

Это больше хака, на компоненте вы можете сделать это:

constructor(elementRef: ElementRef) { 
    elementRef.nativeElement.removeAttribute("id"); 
} 

И это должно избавиться от ид на вашем <my-checkbox></my-checkbox>

+0

Я не знал об ElementRef, спасибо за ответ! Я действительно хочу избежать прямого сражения с угловым контролем над DOM: P – Elliot

0

Вы можете передать id как выражение:

<my-checkbox [id]="'hello'">Check me</my-checkbox> 

В этом случае тег компонента не содержит id атрибут в DOM, он содержит только атрибут ng-reflect-id, который не влияет на поведение по умолчанию для этикетки.

Смежные вопросы