Angular 2で条件付き属性を追加するにはどうすればよいですか?


276

checkedチェックボックスの要素属性などの要素属性をどのように条件付きで追加できますか?

Angularの以前のバージョンにはNgAttr、私NgCheckedが求めていた機能を提供するものがあると思います。ただし、これらの属性はAngular 2には存在しないようであり、この機能を提供する他の方法はありません。




2
googlers、角度コンポーネントに値のない属性が必要な場合は、こちらを参照してください
フランクノッケ

回答:


574

null それを削除します:

[attr.checked]="value ? '' : null"

または

[attr.checked]="value ? 'checked' : null"

ヒント:

属性とプロパティ

あなたはこのバインディングを追加するHTML要素は、(バインディングで使用される名前のプロパティがない場合checkedがある同じ要素に適用されても、この場合には)ノー角度成分や指示を@Input() checked;し、[xxx]="..."使用することはできません。

こちらもご覧ください HTMLのプロパティと属性の違いは何ですか?。

そのようなプロパティがない場合にバインドするもの

代替手段は[style.xxx]="..."、達成しようとしていること[attr.xxx]="..."[class.xxx]="..."応じて、です。

そのため<input>だけ持っているchecked属性は、ないcheckedプロパティは[attr.checked]="..."、この特定のケースのための正しい方法ではありません。

属性は文字列値のみを処理できます

よくある落とし穴は、[attr.xxx]="..."バインディングの場合、値(...)が常に文字列化されることです。プロパティとのみが@Input()、ブール値、数値、オブジェクトなどの他の値タイプを受け取ることができます。

要素のほとんどのプロパティと属性は接続されており、同じ名前を持っています。

プロパティと属性の接続

属性にバインドされると、プロパティは属性から文字列化された値のみを受け取ります。
プロパティにバインドされると、プロパティはプロパティにバインドされた値(ブール値、数値、オブジェクトなど)を受け取り、属性は文字列化された値を受け取ります。

属性名とプロパティ名が一致しない2つのケース。

Angularはそれ以降変更され、これらの特殊なケースを認識して処理しているため、そのよう<label [for]="なプロパティが存在しない場合でもバインドできます(と同じcolspan


3
「attr」は省略できます。接頭辞。
Filip Stachowiak 2017年

16
@FilipStachowiakの場合、属性にはなりません。多くの要素にはさまざまなプロパティがあり、要素自体がプロパティにバインドされた値を属性に反映します(他の方向にも反映します)。この場合は必要ありませんattr.。しかし、あなたはカスタム属性を追加したい場合、あなたは間違いなく必要なattr.接頭辞を
ギュンターZöchbauer

14
明確にするためにattr.この部分が必要です。私は設定しようとして[href]いて、アイテムのhrefプロパティが存在する場合にのみ設定したかったのです。[attr.href]これがないと、「null」の値を持つhrefが追加され、クリックすると現在のページが更新されます。[attr.href]修正しました。
dudewad 2017年

@dudewadそれは私には正しく聞こえません。プロパティhrefを持つ要素に設定する場合href、を使用する必要はありませんattr。何か他のことが間違っているに違いない。
ギュンターZöchbauer

@günter-zöchbauerええと、私はNg 4.xを使用しており<a [href]="item.href">item.hrefundefinedは(undefined値ではなく、プロパティhrefがに存在しないitemhref属性をに設定していましたnull。正直に言って、現時点ではあまり気にしていません(これは非常に細かい部分です)ので、ソースについては詳しく説明しませんでしたattr.が、まったく異なるディレクティブであり、そのため、動作が異なります。
dudewad 2017年

37

angular-2属性の構文は

<div [attr.role]="myAriaRole">

属性の役割を式myAriaRoleの結果にバインドします。

ので使用できます

[attr.role]="myAriaRole ? true: null"

9
ここでの問題は、ときということでyour expressionあるfalseDOM内の属性は次のようになります<div checked="false">。これは意図した効果ではないと思います。
ギュンターZöchbauer

7
ありがとうございます。ただし、条件に値を割り当てるのではなく、属性を条件付きで追加する方法を尋ねました。
ジョナサンマイル

「attr」を省略することもできます。接頭辞。
Filip Stachowiak 2017年

1
@FilipStachowiakの場合、属性にはなりません。多くの要素にはさまざまなプロパティがあり、要素自体がプロパティにバインドされた値を属性に反映します(他の方向にも反映します)。この場合は必要ありませんattr.。しかし、あなたはカスタム属性を追加したい場合、あなたは間違いなく必要なattr.接頭辞を
ギュンターZöchbauer

おお、これ:nullは素晴らしいです。条件付きで使用できることはわかっています。解決策をありがとう。
ピナレラ

17

GünterZöchbauerの回答の洗練:

これは今は違うようです。これを実行して、href属性をアンカータグに条件付きで適用しようとしました。「適用しない」場合は、undefinedを使用する必要があります。例として、条件付きでhref属性が適用されたリンクを使用して説明します。

ハイパーリンクの仕様に従って、href属性のないアンカータグはプレーンテキストになり、リンクのプレースホルダーを示します。

私のナビゲーションでは、リンクのリストがありますが、それらのリンクの1つが現在のページを表しています。現在のページのリンクをリンクにしたくないが、それでもリストに表示したい(カスタムスタイルがいくつかあるが、この例は簡略化されている)。

<a [attr.href]="currentUrl !== link.url ? link.url : undefined">

これは、スパンタグとアンカータグで2つの* ngIfを使用するよりもきれいだと思います。


5

入力要素の場合、次のように記述できます。... <input type="radio" [checked]="condition">条件の値はtrueまたはfalseでなければなりません。

スタイル属性についても... <h4 [style.color]="'red'">Some text</h4>


4

あなたはこれを使うことができます。

<span [attr.checked]="val? true : false"> </span>


'val'を使用して属性値を確認しました。trueになった場合、trueが返され、それ以外の場合はfalseが返されます
WapShivam

1

既存のscssのHTMLを作成する人には、より良いアプローチを使用できます。
html

[attr.role]="<boolean>"

scss

[role = "true"] { ... }

そうすれば、<boolean> ? true : null毎回する必要はありません。


これはすべての場合で機能するわけではありません。たとえばmultipleselect要素の属性では機能しません。
smartmouse


0

以下のコードに追加されているように、特定のフィールドだけにツールチップを設定したかったのですが、次のコマンドを使用して配列を有効にできるように、複数のツールチップを表示したいと考えています。

カスタムデータツールチップ属性を持つ複数の要素:

1:[ 'key1ToHaveTooltip'、 `key2ToHaveTooltip ']。includes(key)

2:['key1ToHaveTooltip'、 'key2ToHaveTooltip']。indexOf(key)> -1

複数の要素にツールチップ属性を持たせる。

   <div *ngFor="let key of Keys"
             [attr.data-tooltip]="key === 'IwantOnlyThisKeyToHaveTooltipAttribute' 
                                           ? 'Hey! I am a tooltip on key matched'
                                           : null">
   </div>

-7

インラインマップも便利です。

それらは、もう少し明示的で読みやすくなっています。

[class]="{ 'true': 'active', 'false': 'inactive', 'true&false': 'some-other-class' }[ trinaryBoolean ]"

3進構文またはngIfs(など)が気に入らない場合に備えて、同じことを実行する別の方法。


1
このクラスは、属性とは全く違うもの(質問が何であるか)である
ギュンターZöchbauer

1
また、質問に適切に答えるように努力することもできます。そうすれば、投票を再検討する理由がありました。また、コメントを追加せずに反対票を投じて、反対票の目的を暗示することもできました。
ギュンターZöchbauer

1
@Codyでは、メソッドがchecked属性をどのように処理するか(コード例を示す)(入力タグから追加/削除 )を説明できます<input type="checkbox" name="vehicle" value="Car" checked>か?(コードを変更classcheckboxた場合、機能しません(これをチェックします))
KamilKiełczewski'20
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.