Ich habe einen einfachen Fall:
%Vor%und jetzt möchte ich in myController -Methode auf myForm zugreifen, um $ setPristine aufzurufen:
%Vor%aber ich kann nicht. Mit tabset / tab wird der isolierte / vererbte Bereich erstellt. Es ist nur ein Beispiel, aber ich stoße auf diese Probleme, wenn ich eckige js-Anweisungen verwende, die isolierte Bereiche oft erzeugen.
Wie kann ich über dieses Problem hinwegkommen? In der Vergangenheit habe ich so etwas gemacht (mit ng-table, das auch einen neuen Bereich erstellt):
%Vor%aber es ist bei weitem nicht perfekt.
Dies war eines der schwierigsten Konzepte für mich um zu bekommen und meine Lösung ist einfach, aber etwas schwierig mit mir so tragen zu erklären.
Wenn Sie nur den Umgang mit nur isolieren Bereiche ( scope: {...}
) oder keinen Raum ( scope: false
), haben Sie Glück, weil die myForm schließlich da sein. Sie müssen nur darauf achten.
Dies ist, wenn Sie scope: true
oder transclude: true
festlegen. Sofern Sie keine benutzerdefinierte / manuelle Übernahme durchführen, erhalten Sie myForm
nicht im Bereich des Controllers.
Der Trick besteht darin, direkt über das Formularelement auf den Controller des Formulars zuzugreifen. Dies kann folgendermaßen geschehen:
%Vor%Damit sind Sie auf ein neues Problem vorbereitet: Wie können wir wissen, wann und wie wir dieses Element und seine Daten erhalten können?
Eine schnelle Antwort ist, dass Sie ein Dummy- $watch
auf dem Controller des Oszilloskops einrichten müssen suchen (in Ihrem Fall) myForm
. Wenn diese Uhr verarbeitet wird, können Sie versuchen, das Formular zu finden. Dies ist aufgrund der Tatsache notwendig, dass der FormController
in der Regel beim ersten Ausführen des Controllers noch nicht im Datenobjekt des Elements enthalten ist.
Eine schnelle und einfache Möglichkeit, das Formular zu finden, besteht darin, einfach alle Formulare abzurufen. . Hinweis: wenn es mehrere Formen innerhalb des Elements sind werden Sie eine gewisse Logik hinzufügen, um die richtige zu finden In diesem Fall unser Formular ist ein Formular-Element und es ist das einzige. Also, es ist ziemlich einfach zu finden:
%Vor%Sobald Sie den Controller haben, können Sie auf alles zugreifen, was Sie normalerweise tun würden. Es ist auch wichtig zu beachten, dass Lösung 2 immer funktioniert, sobald sich FormController auf dem Element befindet.
Ich habe eine Plunk eingerichtet, um den Code hier zu demonstrieren, aber bitte beachten Sie, dass eine Demonstration so nicht alle Best Practices wurden im Hinterkopf behalten.
BEARBEITEN
Ich fand es wichtig zu beachten, dass, wenn Sie Sie nicht nur über die Bereiche der verschachtelten Richtlinien sorgen wollen die Formularnamen auf dem Umfang beobachten können und die Dinge dort zu behandeln.
%Vor%Ich konnte es mit der obigen Antwort nicht zum Laufen bringen, aber ich fand einen Workaround.
Im Formular habe ich ein verstecktes Eingabefeld mit einem ng-Modell und ng-init erstellt, das seinen Wert auf das Formular setzt. Dann kann ich in meiner Submit-Funktion im Controller über dieses ng-Modell auf den formController zugreifen
Ich erstelle also im HTML ein verstecktes Feld innerhalb des Formulars:
%Vor%Und im Controller kann ich den formController über data.myForm
erreichen %Vor%Es ist wahrscheinlich nicht sehr gut, daher werde ich es vermeiden, mich auf die Eigenschaften $ pristine und $ dirty von formController zu verlassen und eine andere Möglichkeit zu finden, zu erkennen, ob sich das Formular geändert hat (mit einer Masterkopie des Objekts, wie sie) in der Probe in der Dokumentation tun)
Tags und Links angularjs angularjs-directive angularjs-scope angular-ui angular-ui-bootstrap