In Angular könnte ich eine Form haben, die so aussieht:
<ng-form>
<label>First Name</label>
<input type="text" ng-model="model.first_name">
<label>Last Name</label>
<input type="text" ng-model="model.last_name">
</ng-form>
Innerhalb des entsprechenden Controllers konnte ich leicht nach Änderungen am Inhalt dieses Formulars suchen:
function($scope) {
$scope.model = {};
$scope.$watch('model', () => {
// Model has updated
}, true);
}
Hier ist ein Angular-Beispiel für JSFiddle .
Ich habe Probleme herauszufinden, wie ich dasselbe in Angular erreichen kann. Offensichtlich haben wir $scope
$ rootScope nicht mehr . Sicher gibt es eine Methode, mit der das Gleiche erreicht werden kann?
Hier ist ein Angular-Beispiel für Plunker .
(ngModelChange)="onModelChange($event)"
Attribut hinzufüge , um dies zu erreichen?Antworten:
UPD. Die Antwort und die Demo werden aktualisiert, um sie an das neueste Angular anzupassen.
Sie können ganze Formularänderungen abonnieren, da FormGroup, die ein Formular darstellt, eine
valueChanges
Eigenschaft bereitstellt, die eine beobachtbare Instanz ist:In diesem Fall müssten Sie das Formular manuell mit FormBuilder erstellen . Etwas wie das:
Schauen Sie sich
valueChanges
diese Demo in Aktion an : http://plnkr.co/edit/xOz5xaQyMlRzSrgtt7Wn?p=previewquelle
valueChanges
Ereignisemitter eines Formulars zu abonnieren, wenn dieses Formular ausschließlich in der Vorlage definiert ist? Mit anderen Worten: Ist es im Konstruktor einer Komponente nicht möglich, einen Verweis auf ein Formular abzurufen, das ausschließlich in der Vorlage dieser Komponente und nicht mithilfe von FormBuilder definiert wurde?@ViewChild()
. Siehe meine aktualisierte Antwort.Wenn Sie verwenden
FormBuilder
, lesen Sie die Antwort von @ dfsq.Wenn Sie nicht verwenden
FormBuilder
, gibt es zwei Möglichkeiten, um über Änderungen informiert zu werden.Methode 1
Verwenden Sie, wie in den Kommentaren zur Frage erläutert, eine Ereignisbindung für jedes Eingabeelement. Zu Ihrer Vorlage hinzufügen:
Dann in Ihrer Komponente:
Auf der Seite Formulare finden Sie einige zusätzliche Informationen zu ngModel, die hier relevant sind:
In Ihrem Fall möchten Sie wahrscheinlich etwas Besonderes tun.
Methode 2
Definieren Sie eine lokale Vorlagenvariable und setzen Sie sie auf
ngForm
.Verwenden Sie ngControl für die Eingabeelemente.
Rufen Sie mit @ViewChild einen Verweis auf die NgForm-Direktive des Formulars ab und abonnieren Sie die ControlGroup der NgForm, um Änderungen vorzunehmen:
plunker
Weitere Informationen zu Methode 2 finden Sie in Savkins Video .
Siehe auch die Antwort von @ Thierry für weitere Informationen darüber, was Sie mit dem
valueChanges
Observable tun können (z. B. Entprellen / Warten vor dem Verarbeiten von Änderungen).quelle
Um ein bisschen mehr frühere großartige Antworten zu vervollständigen, müssen Sie sich bewusst sein, dass Formulare Observable nutzen, um Wertänderungen zu erkennen und zu verarbeiten. Es ist etwas wirklich Wichtiges und Mächtiges. Sowohl Mark als auch dfsq haben diesen Aspekt in ihren Antworten beschrieben.
Mit Observablen kann nicht nur die
subscribe
Methode verwendet werden (ähnlichthen
der Versprechensmethode in Winkel 1). Bei Bedarf können Sie einige Verarbeitungsketten für aktualisierte Daten in Formularen implementieren.Ich meine, Sie können auf dieser Ebene die Entprellzeit mit der
debounceTime
Methode angeben . Auf diese Weise können Sie einige Zeit warten, bevor Sie die Änderung vornehmen, und mehrere Eingaben korrekt verarbeiten:Sie können die Verarbeitung, die Sie auslösen möchten (z. B. eine asynchrone), auch direkt anschließen, wenn Werte aktualisiert werden. Wenn Sie beispielsweise einen Textwert verarbeiten möchten, um eine Liste basierend auf einer AJAX-Anforderung zu filtern, können Sie die folgende
switchMap
Methode nutzen:Sie gehen sogar noch weiter, indem Sie das zurückgegebene Observable direkt mit einer Eigenschaft Ihrer Komponente verknüpfen:
und zeigen Sie es mit der
async
Pipe an:Um nur zu sagen, dass Sie überlegen müssen, wie Sie mit Formularen in Angular2 anders umgehen können (eine viel leistungsfähigere Methode ;-)).
Hoffe es hilft dir, Thierry
quelle
Marks Vorschläge erweitern ...
Methode 3
Implementieren Sie eine "tiefe" Änderungserkennung im Modell. Die Vorteile bestehen hauptsächlich darin, dass keine Aspekte der Benutzeroberfläche in die Komponente integriert werden. Dadurch werden auch programmatische Änderungen am Modell erfasst. Das heißt, es würde zusätzliche Arbeit erfordern, um solche Dinge wie das von Thierry vorgeschlagene Entprellen zu implementieren, und dies wird auch Ihre eigenen programmatischen Änderungen erfassen, also seien Sie vorsichtig.
Versuchen Sie es in Plunker
quelle
Für eckige
5+
Version. Das Setzen der Version hilft, da der Winkel viele Änderungen vornimmt.quelle
Ich dachte über die Verwendung der Methode (ngModelChange) nach, dachte dann über die FormBuilder-Methode nach und entschied mich schließlich für eine Variation von Methode 3. Dies erspart das Dekorieren der Vorlage mit zusätzlichen Attributen und übernimmt automatisch Änderungen am Modell, wodurch die Möglichkeit verringert wird, etwas zu vergessen mit Methode 1 oder 2.
Methode 3 etwas vereinfachen ...
Sie können eine Zeitüberschreitung hinzufügen, um doSomething () erst nach x Millisekunden aufzurufen, um das Entprellen zu simulieren.
quelle