Das ist mein HTML:
<input id="selectedDueDate" type="text" ng-model="selectedDate" />
Wenn ich in die Box tippe, wird das Modell über den 2-Wege-Bindungsmechanismus aktualisiert. Süss.
Allerdings , wenn ich dies tun über JQuery ...
$('#selectedDueDate').val(dateText);
Das Modell wird nicht aktualisiert. Warum?
Antworten:
Angular weiß nichts von dieser Änderung. Dazu sollten Sie Folgendes anrufen
$scope.$digest()
oder ändern$scope.$apply()
:Sehen Sie sich das an, um die Schmutzprüfung besser zu verstehen
UPDATE : Hier ist ein Beispiel
quelle
function
$ scope aufrufen . $ Apply übergeben eine Funktion als Argument. Und $ apply sollte aufgerufen werden, wenn Sie die Änderungen am $ scope vornehmen, also innerhalb von onSelect. Ah, ich gehe davon aus, dass Sie die DOM-Manipulation nur für das Beispiel in den Controllerdatepicker="scopeKeyThatYouWant"
Eingabe so oft verwendet werden, wie Sie möchtenBenutz einfach;
quelle
trigger('input')
mit einem Datepicker in seineronSelect
Veranstaltung verwendet. Der Wert wird korrekt aktualisiert..val('something'
Aufrufs in einen$apply
(oder einen$digest
anschließenden Aufruf ) hat nicht funktioniert.$('#selectedDueDate').val(dateText).trigger('change');
was für mich nicht funktionierte..trigger('input');
funktioniert wie MagieIch habe festgestellt, dass die Variable zuverlässiger aktualisiert wird, wenn Sie sie nicht direkt in den Bereich stellen.
Versuchen Sie es mit einem "dateObj.selectedDate" und fügen Sie im Controller das selectedDate wie folgt zu einem dateObj-Objekt hinzu:
Das hat bei mir funktioniert.
quelle
Versuche dies
quelle
Führen Sie einfach die folgende Zeile am Ende Ihrer Funktion aus:
$ scope. $ apply ()
quelle
Was auch immer außerhalb des Bereichs von Angular passiert, Angular wird das nie erfahren.
Im Digest-Zyklus werden die Änderungen vom Modell -> Controller und dann vom Controller -> Modell übernommen.
Wenn Sie das neueste Modell sehen möchten, müssen Sie den Digest-Zyklus auslösen
Es besteht jedoch die Möglichkeit, dass ein Verdauungszyklus ausgeführt wird. Daher müssen wir den Zyklus überprüfen und initiieren.
Führen Sie vorzugsweise immer eine sichere Anwendung durch.
quelle
AngularJS übergibt Zeichenfolgen, Zahlen und Boolesche Werte als Wert, während Arrays und Objekte als Referenz übergeben werden. Sie können also ein leeres Objekt erstellen und Ihr Datum zu einer Eigenschaft dieses Objekts machen. Auf diese Weise erkennt Angular Modelländerungen.
In der Steuerung
In HTML
quelle
Sie müssen das Änderungsereignis des Eingabeelements auslösen, da ng-model Eingabeereignisse abhört und der Bereich aktualisiert wird. Der reguläre jQuery-Trigger funktionierte jedoch bei mir nicht. Aber hier ist, was wie ein Zauber funktioniert
Das Folgen hat nicht funktioniert
Weitere Informationen zum Erstellen und Versenden synthetischer Ereignisse finden Sie hier .
quelle
Ich habe dieses kleine Plugin für jQuery geschrieben, das alle Aufrufe zum
.val(value)
Aktualisieren des Winkelelements ausführt, falls vorhanden:Fügen Sie dieses Skript einfach nach jQuery und angle.js ein, und
val(value)
Updates sollten jetzt gut funktionieren .Minimierte Version:
Beispiel:
Code-Snippet anzeigen
Diese Antwort wurde wörtlich aus meiner Antwort auf eine andere ähnliche Frage kopiert .
quelle
Benutz einfach:
anstatt:
quelle