Ich baue ein neues SPA-Frontend, um das bestehende System eines veralteten Systems von veralteten und zu aktualisierenden Systemen zu ersetzen. Ich bin neu zu eckig und wollte sehen, ob die Gemeinschaft mir eine Perspektive geben könnte. Ich werde mein Problem angeben und dann meine Frage stellen.Pro/Con der Verwendung von Angular-Direktiven für komplexe Formularvalidierung/GUI-Manipulation
muss ich schließen, basierend auf Daten aus einer .js
mehrere Serien von Checkboxen erzeugen, mit Daten wie folgt aus:
$scope.fieldMappings.investmentObjectiveMap = [
{'id':"CAPITAL PRESERVATION", 'name':"Capital Preservation"},
{'id':"STABLE", 'name':"Moderate"},
{'id':"BALANCED", 'name':"Moderate Growth"},
// etc
{'id':"NONE", 'name':"None"}
];
Die Kontrollkästchen werden erstellt ein ng-repeat
verwenden, wie folgt aus:
<div ng-repeat="investmentObjective in fieldMappings.investmentObjectiveMap">
...
</div>
Ich benötigte jedoch die Werte, die durch die Kontrollkästchen dargestellt wurden, um sie einem anderen Modell zuzuordnen (nicht nur in Zweiwege-Richtung zum Objekt fieldmappings). Um dies zu erreichen, habe ich eine Direktive erstellt, die ein Zielarray destarray
akzeptiert, das schließlich dem Modell zugeordnet wird. Ich weiß auch, dass ich einige sehr spezifische GUI-Steuerelemente behandeln muss, wie zum Beispiel das Deaktivieren von "None", wenn etwas anderes überprüft wird, oder das Aktivieren von "None", wenn alles andere nicht aktiviert ist. Außerdem ist "Keine" in keiner Gruppe von Kontrollkästchen eine Option. Daher muss die Anweisung generisch genug sein, um eine Validierungsfunktion zu akzeptieren, die mit dem checked
-Status der Checkbox-Gruppeneingaben basierend auf dem bereits Angeklickten, aber Intelligent umgehen kann genug, um nicht zu brechen, wenn es keine Option gibt, die "NONE"
genannt wird. Ich fing an, das zu tun, indem ich einen ng-klick hinzufügte, der eine Funktion in der Steuerung anrief, aber indem ich Stapelüberlauf sah, las ich Leute, die sagen, dass es schlecht ist, DOM Manipulationscode in deinem Controller zu setzen - es sollte in Direktiven gehen. Also brauche ich eine andere Richtlinie?
Bisher: (html):
<input my-checkbox-group
type="checkbox"
fieldobj="investmentObjective"
ng-click="validationfunc()"
validationfunc="clearOnNone()"
destarray="investor.investmentObjective" />
Richtlinie Code:
.directive("myCheckboxGroup", function() {
return {
restrict: "A",
scope: {
destarray: "=", // the source of all the checkbox values
fieldobj: "=", // the array the values came from
validationfunc: "&" // the function to be called for validation (optional)
},
link: function (scope, elem, attrs) {
if (scope.destarray.indexOf(scope.fieldobj.id) !== -1) {
elem[0].checked = true;
}
elem.bind('click', function() {
var index = scope.destarray.indexOf(scope.fieldobj.id);
if (elem[0].checked) {
if (index === -1) {
scope.destarray.push(scope.fieldobj.id);
}
}
else {
if (index !== -1) {
scope.destarray.splice(index, 1);
}
}
});
}
};
})
Js Controller-Schnipsel:
.controller('SuitabilityCtrl', ['$scope', function ($scope) {
$scope.clearOnNone = function() {
// naughty jQuery DOM manipulation code that
// looks at checkboxes and checks/unchecks as needed
};
Der obige Code ausgeführt wird und funktioniert gut, außer dem naughty jquery code in clearOnNone()
, weshalb ich diese Frage geschrieben habe.
Und hier ist meine Frage: nach all dem, denke ich mir - ich könnte schon getan werden, wenn ich nur all diese GUI-Logik und Validierung Junk mit jQuery in meinem Controller manuell behandelt. An welchem Punkt wird es töricht, diese komplizierten Anweisungen zu schreiben, über die zukünftige Entwickler mehr rätseln müssen, als wenn ich gerade jQuery Code geschrieben hätte, den 99% von uns mit einem flüchtigen Blick verstehen würden? Wie zeichnen andere Entwickler die Grenze?
Ich sehe diesen Over-Stack-Überlauf. Zum Beispiel scheint this question wie es könnte mit einem Dutzend Zeilen von geradlinigen jQuery beantwortet werden, aber er hat sich entschieden, es den eckigen Weg zu tun, mit einer Direktive und einer partiellen ... es scheint wie viel Arbeit für ein einfaches Problem.
ich nicht diese Frage will die Regeln zu verletzen, so speziell, ich nehme ich wissen möchte: Wie SOLL ich den Code schreiben, ob „None“ (ausgewählt wurde überprüft, ob es als vorhanden eine Option in dieser Gruppe von Kontrollkästchen), und aktivieren/deaktivieren Sie dann die anderen Kontrollkästchen entsprechend? Eine komplexere Richtlinie? Ich kann nicht glauben, dass ich der einzige Entwickler bin, der Code implementieren muss, der komplexer ist als nötig, nur um einen rechthaberischen Rahmen zu erfüllen.Gibt es eine andere Util-Bibliothek, die ich verwenden muss?
+1: Meine Güte, was für eine großartige Frage. Leider ist es zu breit für Stackoverflow. Dies wäre viel besser für Programmers.StackExchange.com geeignet. // PS Ich denke, viele AngularJS-Entwickler kämpfen mit ähnlichen Schwierigkeiten/Kompromissen. –
Nur neugierig, ist Ihr Benutzername eine Hommage an den Hersteller von R.B.I. Baseball? http://en.m.wikipedia.org/wiki/R.B.I._Baseball –
Hat Ihr Controller direkten Zugriff auf die Arrays, die das Formular unterstützen? In diesem Fall sollten Sie nur diese direkt manipulieren, anstatt JQuery zu verwenden, um das DOM zu manipulieren. Ich kann nicht sagen, ob es ein Problem für Sie sein wird, aber Funktionen, die an $ scope angehängt sind, können während einer $ digest-Schleife leicht mehrmals ausgeführt werden, und wenn Sie DOM-Sachen in ihnen machen, kann das sehr ernst sein Performance-Hit. – ivarni