Açısal 2'de koşullu özellik nasıl eklenir?


276

Koşullu olarak nasıl bir eleman özniteliği ekleyebilirim checked?

Angular'ın önceki sürümleri vardı NgAttrve bence NgCheckedhangisinin peşinde olduğum işlevselliği sağlıyor gibi görünüyor. Ancak, bu özniteliklerin Açısal 2'de görünmediği ve bu işlevselliği sağlamanın başka bir yolunu göremiyorum.




2
googlers, açısal bir bileşene değersiz bir özellik istiyorsanız, buraya bakın
Frank Nocke

Yanıtlar:


574

null kaldırır:

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

veya

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

İpucu:

Özellik ile mülk karşılaştırması

Bu bağlayıcıyı eklediğiniz HTML öğesinin, bağlayıcıda kullanılan adla ( checkedbu durumda) bir özelliği olmadığında ve aynı öğeye aynı Açısal bileşen veya yönerge uygulanmadığında @Input() checked;, [xxx]="..."kullanılamaz.

Ayrıca bkz . HTML'deki özellikler ve özellikler arasındaki fark nedir?

Böyle bir mülk olmadığında ne bağlanmalı?

Alternatifler vardır [style.xxx]="...", [attr.xxx]="...", [class.xxx]="..."sen başarmak için deneyin ne bağlı.

Çünkü <input>yalnızca bir checkedözniteliği vardır, ancak hiçbir checkedözellik [attr.checked]="..."bu özel durum için doğru yoldur.

Özellikler yalnızca dize değerlerini işleyebilir

Sık karşılaşılan bir tuzak, [attr.xxx]="..."ciltlemeler için ( ...) değerinin her zaman dizgilendirilmesidir. Yalnızca özellikler ve @Input()s, boolean, number, object, ... gibi diğer değer türlerini alabilir.

Öğelerin çoğu özelliği ve özniteliği birbirine bağlıdır ve aynı ada sahiptir.

Özellik özellik bağlantısı

Özniteliğe bağlı olduğunda, özellik yalnızca öznitelikten dize değeri alır.
Özelliğe bağlı olduğunda, özellik kendisine bağlı değeri (boolean, sayı, nesne, ...) ve öznitelik yine dize değerini alır.

Özellik ve özellik adlarının eşleşmediği iki durum.

Açısal o zamandan beri değiştirildi ve bu özel durumları biliyor ve <label [for]="böyle bir özellik olmasa bile bağlanabilmeniz için bunları ele alıyor (aynı colspan)


3
"Attr." önek.
Filip Stachowiak

16
@FilipStachowiak o zaman bir özellik olmayacak. Öğenin kendisinin bir özelliğe bir özniteliğe (ve diğer yöne) bağlı değeri yansıttığı birçok öğe üzerinde çeşitli özellikler vardır. Bu durumda ihtiyacınız yok attr.. Ancak özel bir özellik eklemek istiyorsanız, kesinlikle attr.önek
gereklidir

14
Açık olmak gerekirse, bunun bir kısmına ihtiyacınız varattr. . Ayarlamaya çalışıyordum [href]ve sadece öğenin hrefözelliği mevcutsa ayarlanmasını istedim . [attr.href]Bu olmadan , tıklandığında geçerli sayfayı yenileyecek 'null' değerine sahip bir href eklenir. [attr.href]onu düzeltti.
dudewad

@dudewad bana doğru gelmiyor. hrefÖzelliğe sahip bir öğeyi ayarlarsanız , hrefkullanmaya gerek yoktur attr. Yanlış giden başka bir şey olmalı.
Günter Zöchbauer

@ günter-zöchbauer Eh, Ng 4.x kullanıyorum ve undefined <a [href]="item.href">nerede item.href(undefined değeri değil, özellik hrefmevcut değil item) hrefözniteliği ayarlıyordu null. Kaynağa girmedim, çünkü dürüstçe bu noktada çok fazla umursamıyorum (bu küçük bir detay), ancak attr.tamamen farklı bir direktif ve bu nedenle farklı davranmak benim için sürpriz değil.
dudewad

37

açısal-2 öznitelik sözdiziminde

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

Özellik rolünü myAriaRole ifadesinin sonucuna bağlar.

böylece kullanabilirsiniz

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

9
Buradaki sorun olduğunda olmasıdır your expressionolduğu falseDOM'da niteliği gibi görünecektir <div checked="false">. Bunun amaçlanan etki olduğunu düşünmüyorum.
Günter Zöchbauer

7
Teşekkürler, ancak koşullu olarak nasıl değer ekleneceğini sordum, koşullu olarak nasıl değer atadığını sordum.
Jonathan Miles

Hatta "attr." önek.
Filip Stachowiak

1
@FilipStachowiak o zaman bir özellik olmayacak. Öğenin kendisinin bir özelliğe bir özniteliğe (ve diğer yöne) bağlı değeri yansıttığı birçok öğe üzerinde çeşitli özellikler vardır. Bu durumda ihtiyacınız yok attr.. Ancak özel bir özellik eklemek istiyorsanız, kesinlikle attr.önek gerekir
Günter Zöchbauer

oh adamım, bu: null inanılmaz, bir şey bunun koşullu olarak kullanılabileceğini biliyordu! çözüm için teşekkürler.
pinarella

17

Günter Zöchbauer rafine cevabı:

Bu şimdi farklı görünüyor. Şartlı olarak bir bağlantı etiketi için bir href özniteliği uygulamak için bunu yapmaya çalışıyordu. 'Uygulanma' davası için undefined kullanmalısınız. Örnek olarak, şartlı olarak href özniteliği uygulanmış bir bağlantıyla göstereceğim.

Href özelliği olmayan bir tutturma etiketi, köprü özelliğine göre bir bağlantı için bir yer tutucusunu gösteren düz metin haline gelir .

Gezinmem için bir bağlantılar listem var, ancak bu bağlantılardan biri geçerli sayfayı temsil ediyor. Geçerli sayfa bağlantısının bir bağlantı olmasını istemedim, ancak yine de listede görünmesini istiyorum (bazı özel stilleri var, ancak bu örnek basitleştirilmiş).

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

Bu bir yayılma ve çapa etiketi üzerinde iki * ngIf kullanmaktan daha temiz olduğunu düşünüyorum.


5

Bir giriş elemanı ise, şöyle bir şey yazabilirsiniz ... <input type="radio" [checked]="condition">Koşul değeri doğru veya yanlış olmalıdır.

Ayrıca stil özellikleri için ... <h4 [style.color]="'red'">Some text</h4>


4

bunu kullanabilirsiniz.

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


Özellik değerinizi 'val' ile kontrol ettiniz. doğru olursa, sadece doğru döner aksi takdirde yanlış değer döndürür
WapShivam

1

Mevcut bir scss için HTML yazan biri için daha iyi bir yaklaşım kullanabilirsiniz.
html

[attr.role]="<boolean>"

SCSS

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

Bu şekilde <boolean> ? true : nullher seferinde gerek kalmaz .


Bu her durumda çalışmaz. Örneğin multiple, selectöğe üzerindeki öznitelik ile çalışmaz .
smartmouse

0

Burada paragraf sadece 'isValid' yazdırılır true / herhangi bir değer içeriyor

<p *ngIf="isValid ? true : false">Paragraph</p>

0

Ben ipucu olmasını istedik sadeceKod aşağıda eklenmiş olarak belirli bir alan için ama araç üzerinde çok sayıda araç ipucu kullanarak kullanarak bir dizi valdidate olabilir:

Özel veri araç ipucuna sahip birden çok Öğe özelliğine sahip :

1: [ 'key1ToHaveTooltip', `key2ToHaveTooltip ']. İçerir (anahtar)

2: ['key1ToHaveTooltip', 'key2ToHaveTooltip']. İndexOf (anahtar)> -1

1'den fazla öğede ipucu özelliğine sahip olmak.

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

-7

Inline-Maps de kullanışlıdır.

Onlar da biraz daha açık ve okunabilir.

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

Üçlü sözdizimini veya ngIfs (vb.)


1
Bir sınıf bir nitelikten tamamen farklı bir şeydir (sorunun ne hakkında olduğu)
Günter Zöchbauer

1
Ayrıca, soruya doğru bir cevap vermek için çaba gösterebilirsiniz, o zaman oyumu tekrar gözden geçirmek için bir nedenim vardı ve ayrıca, karanlıkta ne için olduğu hakkında bir yorum eklemeden aşağı indirebilirdim.
Günter Zöchbauer

1
@Cody, yönteminizin checkedöznitelikle nasıl çalışacağını (giriş etiketine ekleme / kaldırma ) açıklayabilir misiniz (örnek kod verin ) <input type="checkbox" name="vehicle" value="Car" checked>? (biz değiştirirseniz classiçin checkboxkodunuzda bu DEĞİL işi (I) bunu kontrol etmez)
Kamil Kiełczewski
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.