Q1. Angenommen, ich möchte das Aussehen jedes "Elements" ändern, das ein Benutzer zum Löschen markiert, bevor die Hauptschaltfläche "Löschen" gedrückt wird. (Durch diese sofortige visuelle Rückmeldung sollte das sprichwörtliche Dialogfeld "Sind Sie sicher?" Nicht mehr erforderlich sein.) Der Benutzer aktiviert die Kontrollkästchen, um anzugeben, welche Elemente gelöscht werden sollen. Wenn ein Kontrollkästchen deaktiviert ist, sollte dieses Element wieder normal aussehen.
Was ist der beste Weg, um das CSS-Styling anzuwenden oder zu entfernen?
Q2. Angenommen, ich möchte jedem Benutzer erlauben, die Darstellung meiner Website zu personalisieren. Wählen Sie beispielsweise aus einem festen Satz von Schriftgrößen aus, lassen Sie benutzerdefinierte Vordergrund- und Hintergrundfarben zu usw.
Wie kann das vom Benutzer ausgewählte / eingegebene CSS-Styling am besten angewendet werden?
Antworten:
Angular bietet eine Reihe integrierter Anweisungen zum bedingten / dynamischen Bearbeiten des CSS-Stils:
Der normale "Winkelweg" besteht darin, eine Modell- / Bereichseigenschaft an ein UI-Element zu binden, das Benutzereingaben / -manipulationen akzeptiert (dh ng-model verwendet), und diese Modelleigenschaft dann einer der oben genannten integrierten Anweisungen zuzuordnen.
Wenn der Benutzer die Benutzeroberfläche ändert, aktualisiert Angular automatisch die zugehörigen Elemente auf der Seite.
Q1 klingt nach einem guten Fall für die ng-Klasse - das CSS-Styling kann in einer Klasse erfasst werden.
ng-class akzeptiert einen "Ausdruck", der einen der folgenden Werte ergeben muss:
Angenommen, Ihre Elemente werden mit ng-repeat über ein Array-Modell angezeigt, und wenn das Kontrollkästchen für ein Element aktiviert ist, möchten Sie die
pending-delete
Klasse anwenden :Oben haben wir den Ausdruckstyp # 3 der ng-Klasse verwendet - eine Zuordnung / ein Objekt von Klassennamen zu booleschen Werten.
Q2 klingt nach einem guten Fall für ng-style - das CSS-Styling ist dynamisch, daher können wir hierfür keine Klasse definieren.
ng-style akzeptiert einen "Ausdruck", der ausgewertet werden muss für:
Angenommen, der Benutzer kann einen Farbnamen in eine Texbox für die Hintergrundfarbe eingeben (ein jQuery-Farbwähler wäre viel besser):
Geige für beide oben genannten.
Die Geige enthält auch ein Beispiel für ng-show und ng-hide . Wenn ein Kontrollkästchen aktiviert ist, wird zusätzlich zu der rosa gefärbten Hintergrundfarbe Text angezeigt. Wenn 'rot' in das Textfeld eingegeben wird, wird ein div ausgeblendet.
quelle
Ich habe Probleme beim Anwenden von Klassen in Tabellenelementen festgestellt, als ich bereits eine Klasse auf die gesamte Tabelle angewendet hatte (z. B. eine Farbe, die auf die ungeraden Zeilen angewendet wurde
<myClass tbody tr:nth-child(even) td>
). Wenn Sie das Element mit den Entwicklertools untersuchen , wird dem anscheinendelement.style
kein Stil zugewiesen. Anstatt zu verwendenng-class
, habe ich versucht, zu verwendenng-style
, und in diesem Fall wird das neue CSS-Attribut im Inneren angezeigtelement.style
. Dieser Code funktioniert gut für mich:Myvar ist das, was ich evaluiere, und in jedem Fall wende ich
<td>
je nach myvar- Wert einen Stil auf jeden an , der den aktuellen Stil überschreibt, den die CSS-Klasse für die gesamte Tabelle anwendet.AKTUALISIEREN
Wenn Sie beispielsweise beim Besuch einer Seite oder in anderen Fällen eine Klasse auf die Tabelle anwenden möchten, können Sie folgende Struktur verwenden:
Grundsätzlich benötigen wir zum Aktivieren einer ng-Klasse die anzuwendende Klasse und eine wahre oder falsche Aussage. True wendet die Klasse an und false nicht. Hier haben wir also zwei Überprüfungen der Route der Seite und ein ODER zwischen ihnen. Wenn wir uns also im
/route_a
ODER befindenroute_b
, wird die aktive Klasse angewendet.Dies funktioniert nur mit einer Logikfunktion auf der rechten Seite, die true oder false zurückgibt.
Im ersten Beispiel wird ng-style also durch drei Anweisungen bedingt. Wenn alle falsch sind, wird kein Stil angewendet, aber gemäß unserer Logik wird mindestens einer angewendet. Der logische Ausdruck prüft also, welcher Variablenvergleich wahr ist, und da ein nicht leeres Array immer wahr ist, wird dies der Fall sein hat ein Array als return hinterlassen und mit nur einem true, wenn man bedenkt, dass wir OR für die gesamte Antwort verwenden, wird der verbleibende Stil angewendet.
Übrigens habe ich vergessen, Ihnen die Funktion isActive () zu geben:
NEUES UPDATE
Hier haben Sie etwas, das ich wirklich nützlich finde. Wenn Sie eine Klasse abhängig vom Wert einer Variablen anwenden müssen, z. B. ein Symbol, das vom Inhalt der Variablen abhängt,
div
können Sie den folgenden Code verwenden (sehr nützlich inng-repeat
):quelle
Dies funktioniert gut, wenn die ng-Klasse nicht verwendet werden kann (z. B. beim Stylen von SVG):
(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)
Ich habe einen Artikel über die Arbeit mit AngularJS + SVG veröffentlicht. Es spricht über dieses Thema und zahlreiche andere. http://www.codeproject.com/Articles/709340/Implementing-a-Flowchart-with-SVG-and-AngularJS
quelle
ng-attr-
auf der Direktivenseite den Abschnitt ngAttr-Attributbindungen .ng-class
lässt Sie keine Logik ausführen,ng-attr-class
tut es aber . Sie haben beide ihre Verwendung, aber ich kann wetten, dass viele Entwickler danach suchen werdenng-attr-class
.und Code
CSS
quelle
Diese Lösung hat den Trick für mich getan
quelle
Sie können einen ternären Ausdruck verwenden. Es gibt zwei Möglichkeiten, dies zu tun:
oder...
quelle
Eine weitere Option, wenn Sie einen einfachen CSS-Stil mit einer oder zwei Eigenschaften benötigen:
Aussicht:
Regler:
quelle
Siehe folgendes Beispiel
quelle
Ab AngularJS v1.2.0rc
ng-class
und sogarng-attr-class
mit SVG-Elementen fehlgeschlagen (Sie haben früher funktioniert, auch mit normaler Bindung innerhalb des Klassenattributs).Insbesondere funktioniert keine dieser Funktionen jetzt:
Als Workaround muss ich verwenden
und dann mit stylen
quelle
Eine weitere Möglichkeit (in Zukunft), den Stil bedingt anzuwenden, besteht darin, den Stil mit Gültigkeitsbereich bedingt zu erstellen
Heutzutage unterstützt jedoch nur FireFox Stile mit Gültigkeitsbereich.
quelle
Es gibt noch eine weitere Option, die ich kürzlich entdeckt habe und die einige Leute möglicherweise nützlich finden, weil sie es Ihnen ermöglicht, eine CSS-Regel innerhalb eines Stilelements zu ändern, wodurch die Notwendigkeit einer wiederholten Verwendung einer Winkelanweisung wie ng-style, ng-class, vermieden wird. ng-show, ng-hide, ng-animate und andere.
Diese Option verwendet einen Dienst mit Dienstvariablen, die von einem Controller festgelegt und von einer Attributanweisung überwacht werden, die ich als "benutzerdefinierten Stil" bezeichne. Diese Strategie kann auf viele verschiedene Arten angewendet werden, und ich habe versucht, mit dieser Geige eine allgemeine Anleitung zu geben .
quelle
Nun, ich würde vorschlagen, dass Sie den Zustand in Ihrem Controller mit einer Funktion überprüfen, die true oder false zurückgibt .
und überprüfen Sie in Ihrem Controller den Zustand
quelle
Eine Sache, die Sie beachten sollten, ist, dass Sie sie entfernen müssen, wenn der CSS-Stil Bindestriche enthält. Wenn Sie also einstellen möchten,
background-color
ist der richtige Weg:quelle
Hier ist, wie ich den grauen Textstil bedingt auf eine deaktivierte Schaltfläche angewendet habe
Hier ist ein funktionierendes Beispiel:
https://stackblitz.com/edit/example-conditional-disable-button?file=src%2Fapp%2Fapp.component.html
quelle