Bagaimana cara menambahkan atribut kondisional dalam Angular 2?

276

Bagaimana saya bisa menambahkan atribut elemen dengan syarat misalnya checkedkotak centang?

Versi Angular sebelumnya NgAttrdan saya pikir NgCheckedyang semuanya sepertinya menyediakan fungsionalitas yang saya cari. Namun, atribut ini tampaknya tidak ada di Angular 2 dan saya tidak melihat cara lain untuk menyediakan fungsi ini.

Jonathan Miles
sumber
Lihat juga: stackoverflow.com/questions/42179150/…
aloisdg pindah ke codidact.com
2
googler, jika Anda ingin atribut nilai-kurang untuk komponen sudut, lihat di sini
Frank Nocke

Jawaban:

574

null menghapusnya:

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

atau

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

Petunjuk:

Atribut vs properti

Ketika elemen HTML tempat Anda menambahkan pengikatan ini tidak memiliki properti dengan nama yang digunakan dalam pengikatan ( checkeddalam hal ini) dan juga tidak ada komponen atau arahan Angular yang diterapkan ke elemen yang sama yang memiliki @Input() checked;, maka [xxx]="..."tidak dapat digunakan.

Lihat juga Apa perbedaan antara properti dan atribut dalam HTML?

Apa yang harus mengikat ketika tidak ada properti seperti itu

Alternatif yang [style.xxx]="...", [attr.xxx]="...", [class.xxx]="..."tergantung pada apa yang Anda mencoba untuk mencapai.

Karena <input>hanya memiliki checkedatribut, tetapi tidak ada checkedproperti [attr.checked]="..."adalah cara yang tepat untuk kasus khusus ini.

Atribut hanya dapat menangani nilai string

Jebakan yang umum adalah juga bahwa untuk [attr.xxx]="..."binding nilai ( ...) selalu berstruktur. Hanya properti dan @Input()s yang dapat menerima tipe nilai lain seperti boolean, angka, objek, ...

Sebagian besar properti dan atribut elemen terhubung dan memiliki nama yang sama.

Koneksi atribut-properti

Ketika terikat ke atribut, properti juga hanya menerima nilai yang diikat dari atribut.
Ketika diikat ke properti, properti menerima nilai yang terikat padanya (boolean, angka, objek, ...) dan atributnya lagi nilai yang dirangkai.

Dua kasus di mana nama atribut dan properti tidak cocok.

Sudut telah diubah sejak saat itu dan tahu tentang kasus khusus ini dan menanganinya sehingga Anda dapat mengikat <label [for]="meskipun tidak ada properti seperti itu (sama untuk colspan)

Günter Zöchbauer
sumber
3
Anda dapat menghilangkan "attr." awalan.
Filip Stachowiak
16
@FilipStachowiak maka itu tidak akan menjadi atribut. Ada berbagai properti pada banyak elemen di mana elemen itu sendiri mencerminkan nilai yang terikat pada properti ke atribut (dan juga arah lainnya). Dalam hal ini Anda tidak perlu attr.. Tetapi jika Anda ingin menambahkan atribut khusus, Anda pasti memerlukan attr.awalan
Günter Zöchbauer
14
Untuk menjadi jelas, Anda perlu dengan attr.porsi ini. Saya mencoba mengatur [href]dan hanya ingin mengaturnya jika hrefproperti item ada. Tanpa [attr.href]ini akan menambah href dengan nilai 'null', yang, ketika diklik, akan menyegarkan halaman saat ini. [attr.href]memperbaikinya.
dudewad
@dudewad itu tidak terdengar benar bagi saya. Jika Anda menetapkan hrefpada elemen yang memiliki hrefproperti, tidak perlu digunakan attr. Pasti ada sesuatu yang salah.
Günter Zöchbauer
@ günter-zöchbauer Baiklah, saya menggunakan Ng 4.x, dan di <a [href]="item.href">mana item.hreftidak terdefinisi (bukan nilai tidak terdefinisi, tetapi properti hreftidak ada di item) adalah pengaturan hrefatribut null. Saya tidak menyelidiki sumbernya, karena jujur ​​saya tidak terlalu peduli pada saat ini (ini adalah detail kecil), tetapi attr.merupakan arahan yang berbeda sama sekali dan oleh karena itu bertindak berbeda tidak mengherankan bagi saya.
dudewad
37

dalam sintaks atribut angular-2 adalah

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

Mengikat peran atribut ke hasil ekspresi myAriaRole.

jadi bisa pakai like

[attr.role]="myAriaRole ? true: null"
Shaishab Roy
sumber
9
Masalahnya di sini adalah bahwa ketika your expressionadalah falseatribut di DOM akan terlihat seperti <div checked="false">. Saya tidak berpikir ini adalah efek yang dimaksudkan.
Günter Zöchbauer
7
Terima kasih tetapi saya bertanya bagaimana cara menambahkan atribut, tanpa syarat memberikan nilainya.
Jonathan Miles
Anda bahkan dapat menghilangkan "attr." awalan.
Filip Stachowiak
1
@FilipStachowiak maka itu tidak akan menjadi atribut. Ada berbagai properti pada banyak elemen di mana elemen itu sendiri mencerminkan nilai yang terikat pada properti ke atribut (dan juga arah lainnya). Dalam hal ini Anda tidak perlu attr.. Tetapi jika Anda ingin menambahkan atribut khusus, Anda pasti memerlukan attr.awalan
Günter Zöchbauer
oh man, ini: null luar biasa, yang tahu ini bisa digunakan dalam kondisi! terima kasih atas solusinya.
pinarella
17

Menyempurnakan jawaban Günter Zöchbauer:

Tampaknya ini berbeda sekarang. Saya mencoba melakukan ini untuk menerapkan atribut href secara kondisional ke tag anchor. Anda harus menggunakan undefined untuk kasus 'tidak berlaku'. Sebagai contoh, saya akan menunjukkan dengan tautan yang menerapkan atribut href secara kondisional.

Tag anchor tanpa atribut href menjadi teks biasa, yang menunjukkan placeholder untuk suatu tautan, per spesifikasi hyperlink .

Untuk navigasi saya, saya memiliki daftar tautan, tetapi salah satu tautan itu mewakili halaman saat ini. Saya tidak ingin tautan halaman saat ini menjadi tautan, tetapi masih ingin tautan itu muncul dalam daftar (memiliki beberapa gaya khusus, tetapi contoh ini disederhanakan).

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

Ini lebih bersih daripada menggunakan dua * ngIf pada rentang dan tag jangkar, saya pikir.

Ragnaraxis
sumber
5

Jika itu adalah elemen input, Anda dapat menulis sesuatu seperti .... <input type="radio" [checked]="condition">Nilai kondisi harus benar atau salah.

Juga untuk atribut gaya ... <h4 [style.color]="'red'">Some text</h4>

Rohit Tirmanwar
sumber
4

Anda bisa menggunakan ini.

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

WapShivam
sumber
Anda memeriksa nilai atribut Anda dengan 'val'. jika itu benar maka hanya benar mengembalikan sebaliknya nilai pengembalian palsu
WapShivam
1

Anda dapat menggunakan pendekatan yang lebih baik untuk seseorang yang menulis HTML untuk scss yang sudah ada.
html

[attr.role]="<boolean>"

scss

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

Dengan begitu Anda tidak perlu melakukannya <boolean> ? true : nullsetiap saat.

João Ghignatti
sumber
Ini tidak berfungsi dalam setiap kasus. Misalnya itu tidak berfungsi dengan multipleatribut pada selectelemen.
smartmouse
0

Di sini, paragraf dicetak hanya 'isValid' benar / mengandung nilai apa pun

<p *ngIf="isValid ? true : false">Paragraph</p>
Aishwarya Kathavarayan
sumber
0

Saya ingin memiliki tooltip saja untuk bidang tertentu seperti yang ditambahkan di bawah ini dalam kode tetapi Anda ingin memiliki tooltip di multiplent Anda dapat memiliki array valdidate menggunakan:

Beberapa Elemen memiliki tooltip data kustom atribut :

1: [ 'key1ToHaveTooltip', `key2ToHaveTooltip ']. Termasuk (kunci)

2: ['key1ToHaveTooltip', 'key2ToHaveTooltip']. IndexOf (kunci)> -1

untuk memiliki atribut tooltip pada lebih dari 1 elemen.

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

Inline-Maps juga berguna.

Mereka sedikit lebih eksplisit & mudah dibaca juga.

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

Hanya cara lain untuk mencapai hal yang sama, jika Anda tidak menyukai sintaksis ternary atau ngIfs (dll).

Cody
sumber
1
Kelas adalah sesuatu yang sama sekali berbeda dari atribut (apa pertanyaannya tentang)
Günter Zöchbauer
1
Anda juga dapat mengambil upaya untuk menjadikannya jawaban yang tepat untuk pertanyaan itu, maka saya punya alasan untuk mempertimbangkan kembali suara saya dan saya juga bisa menurunkan suara tanpa menambahkan komentar untuk membuat Anda dalam kegelapan tentang apa tujuan downvote itu.
Günter Zöchbauer
1
@Cody dapatkah Anda menjelaskan (berikan kode contoh) bagaimana metode Anda akan bekerja dengan checkedatribut (tambahkan / hapus dari tag input) <input type="checkbox" name="vehicle" value="Car" checked>? (jika kami mengubah classke checkboxdalam kode Anda itu TIDAK bekerja (saya periksa ini))
Kamil Kiełczewski