Ich muss in der Lage sein, beispielsweise "contenteditable" zu Elementen hinzuzufügen, basierend auf einer booleschen Variablen für den Bereich.
Anwendungsbeispiel:
<h1 attrs="{'contenteditable=\"true\"': editMode}">{{content.title}}</h1>
Würde dazu führen, dass contenteditable = true zum Element hinzugefügt wird, wenn $scope.editMode
auf gesetzt wurde true
. Gibt es eine einfache Möglichkeit, dieses Attributverhalten wie bei einer ng-Klasse zu implementieren? Ich denke darüber nach, eine Richtlinie zu schreiben und zu teilen, wenn nicht.
Bearbeiten: Ich kann sehen, dass es einige Ähnlichkeiten zwischen meiner vorgeschlagenen attrs-Direktive und ng-bind-attrs zu geben scheint, aber es wurde in 1.0.0.rc3 entfernt , warum so?
angularjs
angularjs-directive
Kenneth Lynne
quelle
quelle
ng-attr="expression"
.contentEditable
Richtlinie zu erstellen .<h1 ng-attr-contenteditable="{{editMode && true : false}}">{{content.title}}</h1>
Antworten:
Ich verwende Folgendes, um die Klasse attr bedingt festzulegen, wenn ng-class nicht verwendet werden kann (zum Beispiel beim Stylen von SVG):
Der gleiche Ansatz sollte für andere Attributtypen funktionieren.
(Ich denke, Sie müssen auf dem neuesten instabilen Angular sein, um ng-attr- verwenden zu können. Ich bin derzeit auf 1.1.4)
quelle
ng-attr-
, entfernt der Compiler das Präfix und fügt das Attribut hinzu, dessen Wert an das Ergebnis des Winkelausdrucks aus dem ursprünglichen Attributwert gebunden ist.Sie können Attributen
ng-attr
ein Präfix voranstellen, um einen Winkelausdruck auszuwerten. Wenn das Ergebnis der Ausdrücke undefiniert ist, wird der Wert aus dem Attribut entfernt.Wird produzieren (wenn der Wert falsch ist)
Verwenden Sie es also nicht,
false
da dies das Wort "false" als Wert ergibt.Wenn Sie diesen Trick in einer Direktive verwenden. Die Attribute für die Direktive sind falsch, wenn ihnen ein Wert fehlt.
Zum Beispiel wäre das Obige falsch.
quelle
undefined
ein Sonderfall ist. "Bei Verwendung von ngAttr wird das allOrNothing-Flag von $ interpolate verwendet. Wenn also ein Ausdruck in der interpolierten Zeichenfolge zu undefiniert führt, wird das Attribut entfernt und nicht zum Element hinzugefügt."ng-attr-foo
noch immer berufen sich auf diefoo
Richtlinie , wenn es vorhanden ist , auchng-attr-foo
zu auswertetundefined
. DiskussionIch habe das funktioniert, indem ich das Attribut hart eingestellt habe. Steuern der Anwendbarkeit von Attributen mithilfe des Booleschen Werts für das Attribut.
Hier ist das Code-Snippet:
Ich hoffe das hilft.
quelle
In der neuesten Version von Angular (1.1.5) haben sie eine bedingte Direktive namens aufgerufen
ngIf
. Es unterscheidet sich vonngShow
undngHide
darin, dass die Elemente nicht ausgeblendet, aber überhaupt nicht im DOM enthalten sind. Sie sind sehr nützlich für Komponenten, deren Erstellung teuer ist, die aber nicht verwendet werden:quelle
<h1 ng-if="editMode" contenteditable="true"><h1 ng-if="!editMode">
ng-if
ein neuer Bereich entsteht.ng-if
erstellt einen neuen Bereich,ng-show
tut dies aber nicht. Diese Inkonsistenz war für mich immer ein wunder Punkt. Die defensive Programmierreaktion darauf lautet: "Binden Sie immer an etwas, das ein Punkt im Ausdruck ist", und es wird kein Problem sein.Um ein Attribut zu erhalten, das einen bestimmten Wert basierend auf einer booleschen Prüfung anzeigt oder vollständig weggelassen wird, wenn die boolesche Prüfung fehlgeschlagen ist, habe ich Folgendes verwendet:
ng-attr-example="{{params.type == 'test' ? 'itWasTest' : undefined }}"
Anwendungsbeispiel:
<div ng-attr-class="{{params.type == 'test' ? 'itWasTest' : undefined }}">
Würde ausgeben
<div class="itWasTest">
oder<div>
basierend auf dem Wert vonparams.type
quelle
<h1 ng-attr-contenteditable="{{isTrue || undefined }}">{{content.title}}</h1>
wird produzieren, wenn isTrue = true:
<h1 contenteditable="true">{{content.title}}</h1>
und wenn isTrue = false:
<h1>{{content.title}}</h1>
quelle
<h1 ng-attr-contenteditable="{{isTrue ? 'row' : undefined}}">{{content.title}} </h1>
<video ng-attr-autoplay="{{vm.autoplay || undefined}}" />
In Bezug auf die akzeptierte Lösung, die von Ashley Davis veröffentlicht wurde, druckt die beschriebene Methode das Attribut weiterhin im DOM, unabhängig davon, dass der ihm zugewiesene Wert undefiniert ist.
Beispiel: Bei einem Eingabefeld-Setup mit einem ng-Modell und einem Wertattribut:
Unabhängig davon, was hinter myValue steckt, wird das value- Attribut immer noch im DOM gedruckt und somit interpretiert. Das Ng-Modell wird dann überschrieben.
Ein bisschen unangenehm, aber ng-if macht den Trick:
Ich würde empfehlen, eine detailliertere Prüfung in den ng-if-Anweisungen durchzuführen :)
quelle
Sie können auch einen Ausdruck wie diesen verwenden:
quelle
Ich habe tatsächlich vor ein paar Monaten einen Patch dazu geschrieben (nachdem jemand in #angularjs auf freenode danach gefragt hat).
Es wird wahrscheinlich nicht zusammengeführt, ist aber ngClass sehr ähnlich: https://github.com/angular/angular.js/pull/4269
Unabhängig davon, ob es zusammengeführt wird oder nicht, ist das vorhandene ng-attr- * -Material wahrscheinlich für Ihre Anforderungen geeignet (wie andere bereits erwähnt haben), obwohl es möglicherweise etwas klobiger ist als die von Ihnen vorgeschlagene ngClass-ähnliche Funktionalität.
quelle
Für die Eingabefeldvalidierung können Sie Folgendes tun:
Dadurch wird das Attribut nur angewendet
max
,100
wenndiscountType
definiert ist als%
quelle
Bearbeiten : Diese Antwort bezieht sich auf Angular2 +! Entschuldigung, ich habe den Tag verpasst!
Ursprüngliche Antwort:
Der sehr einfache Fall, in dem Sie ein Attribut nur anwenden (oder festlegen) möchten, wenn ein bestimmter Eingabewert festgelegt wurde, ist so einfach wie
Es ist das gleiche wie:
(OptionalValue wird also angewendet, wenn der Ausdruck falsch ist und das Attribut nicht angewendet wird.)
Beispiel: Ich hatte den Fall, dass ich eine Farbe anwenden ließ, aber auch beliebige Stile, bei denen das Farbattribut nicht funktionierte, da es bereits festgelegt war (auch wenn die Farbe @Input () nicht angegeben wurde):
Daher wurde "style.color" nur festgelegt, wenn das Farbattribut vorhanden war. Andernfalls konnte das Farbattribut in der Zeichenfolge "styles" verwendet werden.
Dies könnte natürlich auch mit erreicht werden
und
quelle
Nur für den Fall, dass Sie eine Lösung für Angular 2 benötigen, verwenden Sie einfach die unten stehende Eigenschaftsbindung, z. B. möchten Sie die Eingabe nur bedingt schreibgeschützt machen und dann in attrigen Klammern das Attribut gefolgt von = Zeichen und Ausdruck einfügen.
quelle
Konnte dies zum Laufen bringen:
Das Schöne dabei ist, dass wenn item.isSelected false ist, das Attribut einfach nicht gerendert wird.
quelle