Как установить атрибут id элемента HTML динамически с помощью angularjs (1.x)?

266

При условии, что HTML-элемент типа div, как установить значение его idатрибута, который является объединением переменной области видимости и строки?

Тьерри Марианна
источник

Ответы:

393

ngAttr Директива может быть полностью полезна здесь, как указано в официальной документации

https://docs.angularjs.org/guide/interpolation#-ngattr-for-binding-to-arbitrary-attributes

Например, чтобы установить idзначение атрибута divэлемента, чтобы он содержал индекс, фрагмент представления может содержать

<div ng-attr-id="{{ 'object-' + myScopeObject.index }}"></div>

который будет интерполирован к

<div id="object-1"></div>
Тьерри Марианна
источник
1
Откуда myScopeObjectберутся? Где бы я это определил?
Ян Огард
1
@JanAagaard Предположим, что myScopeObjectэто свойство scopeобъекта, экспонируемого с помощью контроллера. Пожалуйста, смотрите также docs.angularjs.org/guide/controller . Это достаточно ясно для вас или я укажу дальше?
Тьерри Марианна,
я сделал ng-attr-id = "{{'Panel' + file.Id}}", но он не генерирует id = "Panel12312" для меня :(
Мануэль Маэстрини
17
Разве следующие два не идентичны по поведению: <div id="{{ 'object' + index }}">а <div ng-attr-id="{{ 'object' + index }}">? Документы, кажется, говорят, что готовится ng-attr-помочь в случаях, когда элемент является чем-то нестандартным, например, не a <div>. Я правильно читаю документы?
broc.seib
3
@ broc.seib с использованием nd-attr - это не только стандарт. Это хорошая практика, потому что интерпретатор HTML может назначить идентификатор элементу до загрузки angular. Кроме того, ng-attr обеспечивает присваивание идентификатора элементу только при загрузке angular. То же самое относится и к ng-src в теге <img>.
Алекс
70

Эта вещь работала для меня довольно хорошо:

<div id="{{ 'object-' + $index }}"></div>

Танвир Шейх
источник
Время летит, и, пожалуй, самый интуитивно понятный синтаксис теперь работает как положено. Я помню некоторые проблемы при переборе списка.
Тьерри Марианна
2
Это будет работать правильно в 90% случаев, но иногда вы можете получить ошибки, которые трудно отладить. Вместо этого вы должны использовать ng-attr-id.
Baki
ng-attr-idвыгодно в 0% ситуаций. Примеры не могут быть предоставлены, потому что их нет.
omikes
5
ng-attr-idМетод для того, чтобы сырье нг выражение никогда не оказывается в допустимом атрибута HTML (например id, labelи т.д.). Это должно остановить любое последующее использование чтения ng 'junk' (например, до завершения рендеринга или после сбоя js)
Overflew
35

В случае, если вы пришли к этому вопросу, но связаны с более новой версией Angular> = 2.0 .

<div [id]="element.id"></div>
SoEzPz
источник
3
Это бесполезно, вопрос в контексте AngularJS
BTK
9
Я согласен; это будет полезно только тем участникам, которые считают это полезным.
SoEzPz
16
Некоторые участники все еще нажимают на ссылки Angularjs, даже если они ищут ссылки Angular. Это немного сбивает с толку, и ошибки будут продолжать происходить.
SoEzPz
24

Более элегантный способ добиться такого поведения - просто:

<div id="{{ 'object-' + myScopeObject.index }}"></div>

Для моей реализации я хотел, чтобы каждый элемент ввода в ng-repeat имел каждый уникальный идентификатор, с которым ассоциируется метка. Таким образом, для массива объектов, содержащихся в myScopeObjects, можно сделать это:

<div ng-repeat="object in myScopeObject">
    <input id="{{object.name + 'Checkbox'}}" type="checkbox">
    <label for="{{object.name + 'Checkbox'}}">{{object.name}}</label>
</div>

Возможность генерировать уникальные идентификаторы на лету может быть очень полезна при динамическом добавлении контента, подобного этому.

Кумуло Нимбус
источник
Я думаю, что у этого подхода есть проблемы. Я инициализирую угловое связывание после загрузки страницы. Теперь иногда div не загружается должным образом, что, я думаю, из-за столкновения id другого div.
Sumeet
Интересный. Если бы вы могли воспроизвести свое поведение на примере плунжера, я был бы рад проверить его. Работает ли 'ng-attr-id =' и работает ли просто 'id ='?
Cumulo Nimbus
9

Вы можете просто сделать следующее

В твоем JS

$scope.id = 0;

В вашем шаблоне

<div id="number-{{$scope.id}}"></div>

который будет оказывать

<div id="number-0"></div>

Нет необходимости соединять внутри двойные фигурные скобки.

emil.c
источник
3

Просто <input id="field_name_{{$index}}" />

Д. Мохамед
источник
Почему $ перед индексом?
Пипо
Я думаю, что это, вероятно, потому что это должно быть в нг-повтор?
gian1200
Точно @Pipo Вы можете, может быть, проверить здесь docs.angularjs.org/api/ng/directive/ngRepeat :)
D. Мохамед
0

Если вы используете этот синтаксис:

<div ng-attr-id="{{ 'object-' + myScopeObject.index }}"></div>

Angular сделает что-то вроде:

 <div ng-id="object-1"></div>

Однако этот синтаксис:

<div id="{{ 'object-' + $index }}"></div>

будет генерировать что-то вроде:

<div id="object-1"></div>
К Раджеш Кумар
источник
6
Объясните, что вы пытаетесь сказать?
Кумар,
6
Зачем ng-attr-idсоздавать ng-id..? это неверно. Интересно, кто голосует против этого
TJ