Provided an HTML element of type div, how to set the value of its id attribute, which is the concatenation of a scope variable and a string ? 
 
    
    - 9,432
- 5
- 31
- 46
7 Answers
ngAttr directive can totally be of help here, as introduced in the official documentation 
https://docs.angularjs.org/guide/interpolation#-ngattr-for-binding-to-arbitrary-attributes
For instance, to set the id attribute value of a div element, so that it contains an index, a view fragment might contain
<div ng-attr-id="{{ 'object-' + myScopeObject.index }}"></div>
which would get interpolated to
<div id="object-1"></div>
 
    
    - 9,432
- 5
- 31
- 46
- 
                    2Where does `myScopeObject` come from? Where would I define it? – Jan Aagaard Oct 06 '14 at 08:26
- 
                    1@JanAagaard Let us assume `myScopeObject` is a property of a `scope` object exposed using a controller. Please see also https://docs.angularjs.org/guide/controller. Is that clear enough for you or shall I elaborate further? – Th. Ma. Oct 06 '14 at 13:03
- 
                    i did ng-attr-id="{{ 'Panel' + file.Id }}" but it does not generate id="Panel12312" for me :( – Manuel Maestrini May 23 '15 at 05:47
- 
                    17Aren't the following two identical in behavior: `` and `– broc.seib Jul 09 '15 at 01:41` ? The docs seem to say prepending `ng-attr-` is to help out for cases where the element is something non-standard, like not a ``. Am I reading the docs right?
- 
                    Hi please check this is not working for me ng-attr-id="{{'note_'+Note.NoteId}}" – Ankit Apr 25 '17 at 12:56
- 
                    4@broc.seib using nd-attr is not only about standard. This is good practice because HTML interpreter can assign id to the element before angular gets loaded. And ng-attr ensures to assign id to the element only when angular gets loaded. same is the case for ng-src intag. – Ankit Apr 25 '17 at 13:00 
- 
                    This answer is wrong. @broc.seib is right, according to the article linked to in this answer there are few situations where `ng-attr-` is necessary; `id` is not one of them. – omikes Dec 28 '17 at 19:42
This thing worked for me pretty well:
<div id="{{ 'object-' + $index }}"></div>
 
    
    - 1,678
- 14
- 27
- 
                    Time flies and perhaps, the most intuitive syntax now just works as expected. I remember having some issues while iterating over a list. – Th. Ma. Jan 13 '15 at 11:24
- 
                    2This will work correct in 90% of cases but you may sometimes get errors which are hard to debug. You should use ng-attr-id instead. – Baki Jun 03 '16 at 13:32
- 
                    `ng-attr-id` is advantageous in 0% of situations. No examples can be provided, because there are none. – omikes Dec 28 '17 at 19:48
- 
                    8The `ng-attr-id` method is to ensure that the raw ng expression is never rendered in a valid HTML attribute (e.g. `id`, `label`, etc). This is to stop any downstream usage reading ng 'junk' (e.g. before render is complete, or after a js crash) – Overflew Jan 10 '18 at 00:38
In case you came to this question but related to newer Angular version >= 2.0.
<div [id]="element.id"></div>
 
    
    - 12,879
- 7
- 47
- 76
 
    
    - 14,958
- 8
- 61
- 64
- 
                    3
- 
                    20I agree; it’s only going to be useful to those members that find it useful. – SoEzPz Jan 30 '18 at 17:27
- 
                    29Some members still click on Angularjs links even though they are searching for Angular links. It's a bit confusing and errors will continue to happen. – SoEzPz Jan 30 '18 at 17:46
- 
                    Be careful this is for Angular versions 2 or greater, Agree on this is out of context regarding the question, but the comment is very clear when saying which version of angular is applicable this approach – Luis Raúl Espinoza Barboza Jan 28 '22 at 15:22
- 
                    3Google doesn't seem to care much about the difference between AngularJS and Angular 2. This is helpful, thanks. – WesFanMan Oct 24 '22 at 14:35
A more elegant way I found to achieve this behaviour is simply:
<div id="{{ 'object-' + myScopeObject.index }}"></div>
For my implementation I wanted each input element in a ng-repeat to each have a unique id to associate the label with. So for an array of objects contained inside myScopeObjects one could do this:
<div ng-repeat="object in myScopeObject">
    <input id="{{object.name + 'Checkbox'}}" type="checkbox">
    <label for="{{object.name + 'Checkbox'}}">{{object.name}}</label>
</div>
Being able to generate unique ids on the fly can be pretty useful when dynamically adding content like this.
 
    
    - 8,785
- 9
- 47
- 68
- 
                    I think this approach has issues. I am initializing the angular binding after the page is loaded. Now at times the div fails to load properly which I guess is because of clash of id of different div. – sumeet Jun 05 '15 at 09:01
- 
                    Interesting. If you could reproduce your behavior in a plunker example I would be happy to check it out. Does using 'ng-attr-id=' work and just using 'id=' not? – Cumulo Nimbus Jun 07 '15 at 23:52
You could just simply do the following
In your js
$scope.id = 0;
In your template
<div id="number-{{$scope.id}}"></div>
which will render
<div id="number-0"></div>
It is not necessary to concatenate inside double curly brackets.
 
    
    - 1,987
- 2
- 26
- 46
Just <input id="field_name_{{$index}}" />
 
    
    - 75
- 1
- 4
- 
                    
- 
                    I think it is probably because that is supposed to be in a ng-repeat? – gian1200 Mar 22 '19 at 14:06
- 
                    Exact . @Pipo you should, may be, check here https://docs.angularjs.org/api/ng/directive/ngRepeat :) – D. Mohamed Apr 19 '19 at 09:54
If you use this syntax:
<div ng-attr-id="{{ 'object-' + myScopeObject.index }}"></div>
Angular will render something like:
 <div ng-id="object-1"></div>
However this syntax:
<div id="{{ 'object-' + $index }}"></div>
will generate something like:
<div id="object-1"></div>
 
    
    - 3,125
- 1
- 23
- 35
 
    
    - 267
- 3
- 8
- 
                    7
- 
                    7Why should `ng-attr-id` create `ng-id`..? that's wrong. I wonder who upvotes this – T J Apr 28 '16 at 04:32