Deaktiviert die Übergabeschaltfläche basierend auf Feldern, die mit ng-bind-html hinzugefügt wurden

8

JSFiedle hier: Ссылка

Ich erstelle dynamisch Formulare und Schaltflächen und möchte die Schaltflächen deaktivieren, wenn die erforderlichen Formulareingaben nicht abgeschlossen sind.

HTML:

%Vor%

JavaScript:

%Vor%

choicesForm.$invalid ist false und ändert sich nicht, wenn Text in das Eingabefeld eingegeben wird.

Lösung:

Am Ende habe ich die Anweisung angular-bind-html-compile von hier verwendet: Ссылка

Hier ist das relevante Bit des Arbeitscodes:

%Vor%

Und die Auswahlmöglichkeiten könnten ein Snippit von HTML wie folgt sein:

%Vor%     
disperse 10.03.2016, 15:39
quelle

5 Antworten

6

Das Hauptproblem ist, dass ngBindHtml das HTML nicht kompiliert - Es fügt den HTML-Code so ein, wie er ist. Sie können sogar die dynamische Eingabe überprüfen und sehen, dass sie nicht die ngModels CSS-Klassen ( ng-pristine , ng-untouched , usw.), was eine große rote Flagge ist.

In Ihrem Fall weiß das Formular einfach nicht, dass Sie eine weitere Eingabe hinzugefügt haben oder irgendetwas hat sich geändert. Sein Zustand ($ pristine, $ valid, etc) wird nicht durch seinen HTML-Code, sondern durch den registrierten NgModelControllers . Diese Controller werden automatisch hinzugefügt, wenn ein ngModel verknüpft ist.

  • Zum Beispiel hat <input required type='text'> keinen Einfluss auf die Gültigkeit des Formulars, auch wenn es erforderlich ist, da es ngModel nicht zugewiesen ist.
  • Aber dieses <div ng-model="myDiv" required></div> wird sich darauf auswirken, da es benötigt wird und ihm ngModel zugewiesen ist.

Die ngDisabled Anweisung für Ihre Schaltflächen funktioniert wie erwartet, da sie von forms $ ungültige Eigenschaft .

Sieh dir diese Geige an, die zeigt, wie ngModel seinen Controller registriert. Beachten Sie, dass das HTML mit der dynamischen Eingabe nach 750 ms kompiliert wird, um zu zeigen, wie NgModelControllers nach FormController wurde instanziiert.

Es gibt ein paar Lösungen in Ihrem Fall:

  • verwenden Sie eine benutzerdefinierte Anweisung, um HTML zu binden und zu kompilieren - wie dieser

  • Verwenden Sie ngInclude , das den HTML-Code kompiliert

  • Verwenden Sie $ compile , um das neu hinzugefügte HTML zu kompilieren, aber das ist ein bisschen schwierig da Sie nicht genau wissen, wann diese Aktion ausgeführt werden soll

Cosmin Ababei 21.03.2016, 16:30
quelle
2

Dies ist eine unvollständige Antwort, weil ich den Code im Moment nicht machen kann.

Ich denke, dass Ihr HTML-Code enthalten sein wird, nicht kompiliert. Daher sind die Eingaben nicht an Winkelelemente gebunden und sind nicht Teil des eckigen Formularobjekts.

Der einzige Weg, den ich sehe, ist eine Direktive, die das übergebene HTML kompiliert und es zu Ihrem Formular hinzufügt. Dies kann jedoch ziemlich schwierig sein, wenn Sie auf diese Weise gehen möchten, schlage ich vor, Ihre Frage zu bearbeiten, um nach der besagten Anweisung zu fragen.

Allerdings bin ich mit $ compile nicht wirklich vertraut, daher weiß ich nicht, ob es funktioniert, einfach $ compile um $ sce.trustAsHtml ()

hinzuzufügen     
Walfrat 10.03.2016 16:09
quelle
1

Sie können eine Methode schreiben, da ng-disabled nicht mit booleans arbeitet, sondern mit 'checked' string:

Setzen Sie also auf Ihrem Controller eine Methode:

%Vor%

Und in Ihrer Sicht verwenden Sie es auf eckigen Ausdruck:

%Vor%

Hier ist eine funktionierende Geige

    
Burimi 17.03.2016 18:02
quelle
1

Arbeitsdemo

Dies ist die Lösung, nach der Sie suchen. Sie benötigen eine benutzerdefinierte Anweisung. In meinem Beispiel habe ich eine Direktive namens compile-template verwendet und in div element eingefügt.

%Vor%

Richtliniencode:

%Vor%

Ich fand die Richtlinie in dieser Geige .

    
Khalid Hussain 23.03.2016 10:37
quelle
1

Ich glaube, was wirklich passiert, aber aufgrund von jfiddle kann ich die eigentlichen Bereiche, die hier erstellt werden, nicht sezieren.

%Vor%

Das erste Div ist Ihr Top-Level-Bereich, Ihr Formular ist der erste untergeordnete Bereich. Wenn Sie das div mit einer Funktion hinzufügen, wird das dynamisch hinzugefügte Eingabefeld als untergeordnetes Element des ersten untergeordneten Elements, eines Enkels des Bereichs auf oberster Ebene, erstellt. Daher kennt Ihr Formular die Elemente, die Sie dynamisch hinzufügen, sodass nur das statische Feld für einen gültigen Formulareintrag erforderlich ist.

Eine bessere Lösung wäre es, ng-inclue für zusätzliche Formularfelder zu verwenden oder wenn Ihr Formular nicht zu groß ist, legen Sie es einfach auf die Seite oder Vorlage, die Sie verwenden.

    
aallord 24.03.2016 02:11
quelle

Tags und Links