Bearbeiten 2: Ich werde meine Antwort hinterlassen, da sie aus anderen Gründen hilfreich sein könnte, aber die andere Antwort von Mark Rajcok ist das, was ich ursprünglich tun wollte, aber nicht zur Arbeit kam. Anscheinend wäre der übergeordnete Controller hier form
nicht ngForm
.
Sie können es mit einem Attribut in Ihrer Direktive übergeben, obwohl dies ziemlich ausführlich wird.
Beispiel
Hier ist eine funktionierende, vereinfachte jsFiddle .
Code
HTML:
<div ng-form="myForm">
<my-input form="myForm"></my-input>
</div>
Wesentliche Teile der Richtlinie:
app.directive('myInput', function() {
return {
scope: {
form: '='
},
link: function(scope, element, attrs) {
console.log(scope.form);
}
};
});
Was ist los
Wir haben Angular gebeten, den im form
Attribut genannten Bereichswert mithilfe von a an unseren isolierten Bereich zu binden '='
.
Auf diese Weise wird die tatsächliche Form von der Eingabeanweisung entkoppelt.
Hinweis: Ich habe versucht, zu verwenden require: "^ngForm"
, aber die ngForm-Direktive definiert keinen Controller und kann nicht auf diese Weise verwendet werden (was zu schade ist).
Trotzdem denke ich, dass dies eine sehr ausführliche und unordentliche Art ist, damit umzugehen. Es ist möglicherweise besser, dem Formularelement eine neue Direktive hinzuzufügen und require
auf dieses Element zuzugreifen. Ich werde sehen, ob ich etwas zusammenstellen kann.
Bearbeiten: Verwenden einer übergeordneten Direktive
OK, hier ist das Beste, was ich mit einer übergeordneten Direktive herausfinden kann. Ich werde gleich mehr erklären:
Arbeits jsFiddle Mutter Direktive
HTML:
<div ng-app="myApp">
<div ng-form="theForm">
<my-form form="theForm">
<my-input></my-input>
</my-form>
</div>
</div>
JS (teilweise):
app.directive('myForm', function() {
return {
restrict: 'E',
scope: {
form: '='
},
controller: ['$scope', function($scope) {
this.getForm = function() {
return $scope.form;
}
}]
}
});
app.directive('myInput', function() {
return {
require: '^myForm',
link: function(scope, element, attrs, myForm) {
console.log(myForm.getForm());
}
};
});
Dadurch wird das Formular im Bereich der übergeordneten Direktive ( myForm
) gespeichert , und untergeordnete Direktiven können darauf zugreifen, indem sie das übergeordnete Formular ( require: '^myForm'
) benötigen und in der Verknüpfungsfunktion ( myForm.getForm()
) auf den Controller der Direktive zugreifen .
Leistungen:
- Sie müssen das Formular nur an einer Stelle identifizieren
- Sie können Ihren übergeordneten Controller verwenden, um allgemeinen Code zu speichern
Negative:
- Sie benötigen einen zusätzlichen Knoten
- Sie müssen den Formularnamen zweimal eingeben
Was ich bevorzugen würde
Ich habe versucht, es mithilfe eines Attributs für das Formularelement zum Laufen zu bringen . Wenn dies funktioniert, müssen Sie die Direktive nur demselben Element wie hinzufügen ngForm
.
Ich bekam jedoch ein seltsames Verhalten mit dem Bereich, in dem die myFormName
Variable sichtbar sein $scope
würde, aber undefined
wenn ich versuchte, darauf zuzugreifen. Das hat mich verwirrt.