angularjs(1.x)でHTML要素のid属性を動的に設定するにはどうすればよいですか?


回答:


392

ngAttr 公式ドキュメントで紹介されているように、ディレクティブはここで完全に役立ちます

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

たとえばiddiv要素の属性値を設定して要素にインデックスを含めるには、ビューフラグメントに

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

補間されます

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

1
どこmyScopeObjectから来たの?どこで定義しますか?
Jan Aagaard 2014年

1
@JanAagaardが、コントローラを使用して公開されmyScopeObjectscopeオブジェクトのプロパティであると仮定します。docs.angularjs.org/guide/controllerも参照してください。それで十分でしょうか、それとももう少し詳しく説明しますか?
Thierry Marianne

ng-attr-id = "{{'Panel' + file.Id}}"を実行しましたが、id = "Panel12312"を生成しません:(
Manuel Maestrini、

17
動作中の同一の次の二つではありません:<div id="{{ 'object' + index }}"><div ng-attr-id="{{ 'object' + index }}">?ドキュメントはng-attr-、要素がのような非標準的なものである場合を助けるために前に付加することであると言っているようです<div>。私はドキュメントを正しく読んでいますか?
broc.seib 2015

3
nd-attrを使用した@ broc.seibは、標準的なものだけではありません。HTMLインタープリターは、angularが読み込まれる前に要素にIDを割り当てることができるため、これは良い習慣です。そしてng-attrは、angularがロードされたときにのみ要素にIDを割り当てることを保証します。<img>タグのng-srcの場合も同様です。
アレックス

70

このことは私にはかなりうまくいきました:

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


時間が経つにつれ、おそらく最も直感的な構文が期待どおりに機能するようになります。リストを繰り返し処理しているときに問題があったことを覚えています。
Thierry Marianne

2
これはケースの90%で正しく機能しますが、デバッグが難しいエラーが発生する場合があります。代わりにng-attr-idを使用してください。
Baki

ng-attr-id状況の0%で有利です。例がないため、例を提供できません。
17

5
ng-attr-idこの方法は、生NG式が(例えば、有効なHTML属性でレンダリングされないことを確実にするためであるidlabelなど)。これは、任意の下流の使用が「ジャンク」をngの読み取りを停止することがある(例えば前にレンダリングし、完全な、またはjsのクラッシュの後で)
Overflew

34

この質問に来たが、新しいAngularバージョン> = 2.0に関連している場合。

<div [id]="element.id"></div>

2
それは役に立たない、問題はAngularJSのコンテキストにあります
btk 2018年

8
同意する; それはそれが有用であると思うそれらのメンバーにのみ役立つでしょう。
SoEzPz 2018年

16
一部のメンバーは、Angularリンクを検索しているにもかかわらず、Angularjsリンクをクリックします。これは少し混乱し、エラーが発生し続けます。
SoEzPz 2018年

24

この動作を実現するために私が見つけたよりエレガントな方法は単純です:

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

私の実装では、ng-repeatの各入力要素にそれぞれラベルを関連付ける一意のIDが必要でした。したがって、myScopeObjects内に含まれるオブジェクトの配列の場合、これを行うことができます。

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

このように動的にコンテンツを追加する場合、その場で一意のIDを生成できると非常に便利です。


このアプローチには問題があると思います。ページが読み込まれた後、角度バインディングを初期化しています。今度はdivが正しくロードされないことがありますが、これは別のdivのIDの衝突が原因であると推測しています。
sumeet 2015年

面白い。プランカーの例であなたの振る舞いを再現できたら、私はそれをチェックして喜んでいます。「ng-attr-id =」を使用しても機能し、「id =」を使用するだけでは機能しませんか?
Cumulo Nimbus

9

あなたは単に以下を行うことができます

あなたのjsで

$scope.id = 0;

テンプレート内

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

レンダリングされます

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

二重中括弧の内側で連結する必要はありません。



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
あなたが言おうとしていることを説明してください。
Kumar

6
なぜ.. をng-attr-id作成する必要がありng-idますか?それは間違っている。誰がこれに賛成するのかしら
TJ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.