Wie man dynamisch erzeugte Eingaben mit ng-repeat, ng-show (angular) validiert
Ich habe eine Tabelle, die erstellt wird, mithilfe von ng-repeat. Ich möchte hinzufügen, um die Validierung zu jedem element in der Tabelle. Das problem ist, dass jede Eingabe die Zelle hat den gleichen Namen wie die Zelle oberhalb und unterhalb. Ich habe versucht, verwenden Sie die {{$index}}
Wert, um den Namen der Eingänge, aber trotz der string-Literale in HTML erscheinen, korrigieren, es funktioniert jetzt.
Hier ist mein code jetzt:
<tr ng-repeat="r in model.BSM ">
<td>
<input ng-model="r.QTY" class="span1" name="QTY{{$index}}" ng-pattern="/^[\d]*\.?[\d]*$/" required/>
<span class="alert-error" ng-show="form.QTY{{$index}}.$error.pattern"><strong>Requires a number.</strong></span>
<span class="alert-error" ng-show="form.QTY{{$index}}.$error.required"><strong>*Required</strong></span>
</td>
</tr>
Ich habe versucht, das entfernen der {{}}
aus dem index, aber das funktioniert auch nicht. Wie jetzt, die Validierung der Eigenschaft der Eingabe funktioniert, aber die Fehlermeldung wird nicht angezeigt.
Jemand irgendwelche Vorschläge?
Edit: neben den großen Antworten, hier ein blog-Artikel, deckt dieses Problem im detail: http://www.thebhwgroup.com/blog/2014/08/angularjs-html-form-design-part-2/
InformationsquelleAutor der Frage PFranchise | 2012-08-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
AngularJS basiert auf der Eingabe von Namen zu setzen-Validierungsfehler.
Leider, wie von heute, ist es nicht möglich (ohne Verwendung einer benutzerdefinierten Richtlinie) dynamisch generieren Sie einen Namen ein Eingang. In der Tat, die überprüfung input-docs können wir sehen, dass das name-Attribut akzeptiert eine Zeichenfolge nur.
Zur Lösung der "dynamische name' problem müssen Sie erstellen eine innere form (siehe ng-form):
Die andere alternative wäre die Erstellung einer benutzerdefinierten Richtlinie für das.
Hier ist das jsFiddle zeigt die Verwendung der ngForm: http://jsfiddle.net/pkozlowski_opensource/XK2ZT/2/
InformationsquelleAutor der Antwort pkozlowski.opensource
Seit die Frage gestellt wurde das Angular-team hat dieses Problem gelöst, indem Sie es ermöglicht, dynamisch erstellen von "input" - Namen.
Mit Eckige version 1.3 und höher können Sie jetzt tun:
Demo
Angular 1.3 eingeführt ngMessages, ein mächtigeres Werkzeug für die Formular-Validierung. Sie können das gleiche Verfahren verwenden, mit ngMessages:
InformationsquelleAutor der Antwort HoffZ
Wenn Sie nicht möchten, zu verwenden, ng-Formular können Sie eine benutzerdefinierte Richtlinie, die die form ändern name-Attribut. Legen Sie diese Direktive als Attribut auf dem gleichen element wie Ihr ng-Modell.
Wenn Sie mit den anderen Richtlinien in Verbindung, seien Sie vorsichtig, dass Sie nicht über die "terminal" - Eigenschaft festlegen, sonst wird diese Funktion nicht ausgeführt werden können (vorausgesetzt, es hat eine Priorität von -1).
Beispielsweise bei der Verwendung dieser Direktive mit ng-Optionen, die Sie ausführen müssen, diese eine Zeile monkeypatch:
https://github.com/AlJohri/bower-angular/commit/eb17a967b7973eb7fc1124b024aa8b3ca540a155
Finde ich es oft nützlich zu verwenden, ng-init setzen der $index variable-name. Zum Beispiel:
Diese änderungen Ihrer regulären Ausdruck:
Wenn Sie mehrere verschachtelte ng-Wiederholungen können Sie jetzt mit diesen Variablennamen anstelle von $Eltern.$index.
Definition von "terminal" und "Priorität" für Richtlinien: https://docs.angularjs.org/api/ng/service/$kompilieren#Richtlinie-definition-Objekt
Github Kommentar bezüglich der Notwendigkeit für ng-option monkeypatch:
https://github.com/angular/angular.js/commit/9ee2cdff44e7d496774b340de816344126c457b3#commitcomment-6832095
https://twitter.com/aljohri/status/482963541520314369
UPDATE:
Können Sie auch diese Arbeit machen mit ng-form.
InformationsquelleAutor der Antwort Al Johri
Verwendung der ng-form-Richtlinie innerhalb des Tags, in dem Sie mit der ng-repeat-Direktive. Sie können dann verwenden Sie den scope-erstellt von ng-form-Richtlinie als Verweis zu einer generischen Namen. Zum Beispiel:
Kredit: http://www.benlesh.com/2013/03/angular-js-validating-form-elements-in.html
InformationsquelleAutor der Antwort
Hinzugefügt komplexeres Beispiel mit "benutzerdefinierte überprüfung" auf der Seite von controller http://jsfiddle.net/82PX4/3/
InformationsquelleAutor der Antwort Mikita Manko
Suchen über diese Lösungen, die von Al Johri oben ist der nächste, um meine Bedürfnisse, aber seine Richtlinie war ein wenig weniger programmierbare dann wollte ich. Hier ist meine version seiner Lösungen:
Dieser Lösung können Sie übergeben Sie einfach einen Namen ein generator-Ausdruck in der Richtlinie und vermeidet die Sperre nach unten, um das Muster der substitution, er war mit.
Hatte ich auch Probleme anfangs mit dieser Lösung, da Sie es nicht zeigen, ein Beispiel für die Verwendung im markup, also hier ist, wie ich es benutzt habe.
Ich habe eine komplette funktionierende Beispiel auf github.
InformationsquelleAutor der Antwort tomgreen98
Validierung ist die Zusammenarbeit mit ng-repeat, wenn ich verwenden Sie die folgende syntax
scope.step3Form['item[107][quantity]'].$touched
Ich weiß nicht, es ist ein best-practice-oder die beste Lösung, aber es funktioniert
InformationsquelleAutor der Antwort Vlad Vinnikov
Gebäude auf pkozlowski.opensource ist Antwort, ich habe einen Weg zu einer dynamischen input-Namen, die auch die Arbeit mit ngMessages. Hinweis: die
ng-init
Teil auf dieng-form
- element und die Verwendung vonfurryName
.furryName
wird die variable name enthält den Wert der Variablen für dieinput
'sname
Attribut.InformationsquelleAutor der Antwort ABCD.ca
Ist es zu spät, aber vielleicht kann mir jemand helfen
fromname[uniquname].$error
Beispielcode:
Finden Sie unter arbeiten demo hier
InformationsquelleAutor der Antwort Ali Adravi
Ist es möglich, und hier ist, wie ich tun die gleiche Sache mit einer Tabelle der Eingänge.
wickeln Sie die Tabelle in ein Formular, wie so
Dann nutzen Sie einfach dieses
Ich habe ein Formular mit mehreren verschachtelten Richtlinien, die alle enthalten-Eingang(s), select(s), etc...
Diese Elemente sind alle eingeschlossen in ng-wiederholt, und dynamischen string-Werte.
Dies ist, wie die Richtlinie:
Hinweis: Sie können hinzufügen und den index für die string-Verkettung, wenn Sie brauchen, um zu serialisieren vielleicht eine Tabelle der Eingänge; das ist, was ich Tat.
Dieser sollte in der Lage viele Situationen, wo man einfach nicht weiß, wo das Formular sein wird. Oder vielleicht haben Sie geschachtelte Formen, aber aus irgendeinem Grund, die Sie Anhängen möchten diese input name zu beiden Formen? Nun, geben Sie einfach in das Formular Namen, den Sie möchten, fügen Sie die input-Namen.
Was ich wollte, war ein Weg, um dynamische Werte zuweisen, die für die Eingänge, die ich nie wissen wird, und dann rufen Sie $Umfang.myFormName.$gültig.
Können Sie hinzufügen, alles, was Sie sich wünschen: mehr Tabellen, mehr Eingänge, verschachtelte Formulare, was auch immer Sie wollen. Geben Sie einfach den Namen des Formulars, das Sie überprüfen möchten die Eingänge vor. Anschließend auf Formular Absenden zu Fragen, ob die $scope.yourFormName.$gültig
InformationsquelleAutor der Antwort SoEzPz
Diese erhalten die Namen in der ng-repeat zu kommen trennen Sie in der Formular-Validierung.
Aber ich hatte Mühe, es zu suchen in Ihrer prüfungsmeldung so musste ich eine ng-init, um es zu lösen, eine variable als Schlüssel des Objektes.
InformationsquelleAutor der Antwort Andrew Clavin
Hier ein Beispiel, wie ich das mache, ich weiß nicht, ob es die beste Lösung, aber funktioniert perfekt.
Ersten code in HTML.
Suchen Sie bei ng-Klasse, es ist Berufung hasError-Funktion.
Schauen Sie auch auf die Eingabe der Namen-Erklärung. Ich verwende die $ - index zu erstellen, der die verschiedenen input-Namen.
Und nun, hier ist die hasError-Funktion:
InformationsquelleAutor der Antwort David Martin
Meine Anforderungen waren ein bisschen anders als diejenigen gefragt, die auf die ursprüngliche Frage, aber ich hoffe ich könnte jemandem helfen, der wird durch das gleiche problem, das war ich..
Musste ich definieren, ob ein Feld erforderlich war oder nicht, basierend auf einer scope-variable.. So dass ich im Grunde musste
ng-required="myScopeVariable"
(das ist eine Boolesche variable).InformationsquelleAutor der Antwort Bartho Bernsmann
Wenn Ihr mit ng-repeat $index funktioniert wie folgt
und
wir haben zu zeigen, die ng-show, ng-pattern
InformationsquelleAutor der Antwort Kondal