Wie kann ich bedingt ein Elementattribut hinzufügen, z. B. das checked
eines Kontrollkästchens?
Frühere Versionen von Angular hatten NgAttr
und ich denke NgChecked
, alle scheinen die Funktionalität zu bieten, nach der ich suche. Diese Attribute scheinen jedoch in Angular 2 nicht vorhanden zu sein, und ich sehe keine andere Möglichkeit, diese Funktionalität bereitzustellen.
javascript
angular
Jonathan Miles
quelle
quelle
Antworten:
null
entfernt es:oder
Hinweis:
Attribut gegen Eigenschaft
Wenn das HTML-Element, in das Sie diese Bindung einfügen, keine Eigenschaft mit dem in der Bindung verwendeten Namen hat (
checked
in diesem Fall) und auch keine Winkelkomponente oder -anweisung auf dasselbe Element angewendet wird, das eine hat@Input() checked;
,[xxx]="..."
kann es nicht verwendet werden.Siehe auch Was ist der Unterschied zwischen Eigenschaften und Attributen in HTML?
Woran zu binden ist, wenn es keine solche Eigenschaft gibt
Alternativen sind
[style.xxx]="..."
,[attr.xxx]="..."
,[class.xxx]="..."
je nachdem , was Sie versuchen zu erreichen.Denn
<input>
nur einchecked
Attribut, aber keinechecked
Eigenschaft[attr.checked]="..."
ist der richtige Weg für diesen speziellen Fall.Attribute können nur Zeichenfolgenwerte verarbeiten
Eine häufige Gefahr besteht auch darin, dass für
[attr.xxx]="..."
Bindungen der Wert (...
) immer stringifiziert ist. Nur Eigenschaften und@Input()
s können andere Werttypen wie Boolesche Werte, Zahlen, Objekte, ... empfangen.Die meisten Eigenschaften und Attribute von Elementen sind miteinander verbunden und haben denselben Namen.
Eigenschaftsattributverbindung
Wenn die Eigenschaft an das Attribut gebunden ist, erhält sie auch nur den String-Wert vom Attribut.
Wenn die Eigenschaft an die Eigenschaft gebunden ist, erhält sie den daran gebundenen Wert (Boolescher Wert, Zahl, Objekt, ...) und das Attribut erneut den Zeichenwert.
Zwei Fälle, in denen Attribut- und Eigenschaftsnamen nicht übereinstimmen.
https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/htmlFor (siehe den ersten Satz der Beschreibung
htmlFor property reflects the value of the for
- hatfor
wahrscheinlich nicht funktioniert, weil es ein Schlüsselwort in C oder JavaScript ist)Warum ist Colspan in Angular 2 kein bekanntes natives Attribut?
Angular wurde seitdem geändert und kennt diese Sonderfälle und behandelt sie so, dass Sie sie binden können,
<label [for]="
obwohl keine solche Eigenschaft vorhanden ist (dasselbe gilt fürcolspan
).quelle
attr.
. Wenn Sie jedoch ein benutzerdefiniertes Attribut hinzufügen möchten, benötigen Sie auf jeden Fall dasattr.
Präfixattr.
Teil davon. Ich habe versucht festzulegen[href]
und wollte nur, dass es festgelegt wird, wenn diehref
Eigenschaft des Elements vorhanden ist. Ohne[attr.href]
dies würde eine href mit dem Wert 'null' hinzugefügt, die beim Klicken die aktuelle Seite aktualisiert.[attr.href]
behoben.href
ein Element mit derhref
Eigenschaft festlegen , müssen Sie es nicht verwendenattr
. Es muss noch etwas schief gehen.<a [href]="item.href">
woitem.href
undefiniert ist (nicht der Wert undefiniert, aber die Eigenschafthref
existiert nicht aufitem
) wurde dashref
Attribut auf gesetztnull
. Ich habe mich nicht mit der Quelle befasst, weil es mich an dieser Stelle ehrlich gesagt nicht sonderlich interessiert (dies ist ein winziges Detail), aber esattr.
handelt sich um eine völlig andere Richtlinie, und daher ist es für mich keine Überraschung, dass ich mich anders verhalte.in Winkel-2 Attribut Syntax ist
Bindet dem Ergebnis des Ausdrucks myAriaRole eine Attributrolle.
so kann man gerne benutzen
quelle
your expression
istfalse
das Attribut in dem DOM aussehen wird<div checked="false">
. Ich denke nicht, dass dies der beabsichtigte Effekt ist.attr.
. Wenn Sie jedoch ein benutzerdefiniertes Attribut hinzufügen möchten, benötigen Sie auf jeden Fall dasattr.
PräfixVerfeinerung Günter Zöchbauer Antwort:
Dies scheint jetzt anders zu sein. Ich habe versucht, dies zu tun, um ein href-Attribut bedingt auf ein Ankertag anzuwenden. Sie müssen undefined für den Fall "Nicht anwenden" verwenden. Als Beispiel werde ich anhand eines Links demonstrieren, bei dem ein href-Attribut bedingt angewendet wird.
Ein Ankertag ohne href-Attribut wird zu einfachem Text, der einen Platzhalter für einen Link gemäß der Hyperlink-Spezifikation angibt .
Für meine Navigation habe ich eine Liste von Links, aber einer dieser Links repräsentiert die aktuelle Seite. Ich wollte nicht, dass der aktuelle Seitenlink ein Link ist, möchte aber dennoch, dass er in der Liste angezeigt wird (er hat einige benutzerdefinierte Stile, aber dieses Beispiel ist vereinfacht).
Dies ist sauberer als die Verwendung von zwei * ngIf auf einem Span- und Anker-Tag, denke ich.
quelle
Wenn es sich um ein Eingabeelement handelt, können Sie so etwas wie ... schreiben.
<input type="radio" [checked]="condition">
Der Wert der Bedingung muss wahr oder falsch sein.Auch für Stilattribute ...
<h4 [style.color]="'red'">Some text</h4>
quelle
Sie können dies verwenden.
<span [attr.checked]="val? true : false"> </span>
quelle
Sie können einen besseren Ansatz für jemanden verwenden, der HTML für ein bereits vorhandenes scss schreibt.
html
scss
Auf diese Weise müssen Sie nicht
<boolean> ? true : null
jedes Mal.quelle
multiple
Attributen fürselect
Elemente.Hier wird der Absatz nur gedruckt. 'IsValid' ist true / enthält einen beliebigen Wert
quelle
Ich wollte einen Tooltip nur für ein bestimmtes Feld haben, wie unten im Code hinzugefügt, aber Sie möchten einen Tooltip für Multiplikatoren haben. Sie können ein Array-Valdidat verwenden, indem Sie:
Mehrere Elemente mit benutzerdefiniertem Daten-Tooltip- Attribut:
1: [ 'key1ToHaveTooltip', `key2ToHaveTooltip ']. Includes (key)
2: ['key1ToHaveTooltip', 'key2ToHaveTooltip']. IndexOf (key)> -1
Tooltip-Attribut für mehr als 1 Element haben.
quelle
Auch Inline-Maps sind praktisch.
Sie sind auch etwas expliziter und lesbarer.
Nur eine andere Möglichkeit, dasselbe zu erreichen, falls Ihnen die ternäre Syntax oder
ngIf
s (usw.) nicht gefällt .quelle
checked
Attributen (Hinzufügen / Entfernen zum Eingabe-Tag) in funktioniert<input type="checkbox" name="vehicle" value="Car" checked>
? (Wenn wir in Ihrem Code ändernclass
,checkbox
funktioniert es NICHT (ich überprüfe dies))