Dieses Problem geschah zu mir, während Sie nicht die ng-if
Direktive auf Elementen verwenden, die das Textarea-Element umgeben. Während die Lösung von Mathew korrekt ist, scheint der Grund ein anderer zu sein. Die Suche nach diesem Problem verweist auf diesen Post, also habe ich beschlossen, dies zu teilen.
Wenn Sie die AngularJS Dokumentation sehen Sie hier https://docs.angularjs.org/api/ng/directive/textarea, können Sie sehen, dass Angular seine eigene Richtlinie fügt <textarea>
genannt, dass „überschreibt“ die Standard-HTML-textarea
Element. Dies ist der neue Bereich, der das ganze Durcheinander verursacht.
Wenn Sie eine Variable wie
$scope.myText = 'Dummy text';
in Ihrem Controller und binden, dass auf dem textarea
Element wie folgt
<textarea ng-model="myText"></textarea>
AngularJS für diese Variable im Geltungsbereich der Richtlinie aussehen wird. Es ist nicht da und so geht er runter zu $ eltern. Die Variable ist dort vorhanden und der Text wird in die textarea
eingefügt. Beim Ändern des Textes in textarea
ändert Angular NICHT die Variable des Elternteils. Stattdessen wird eine neue Variable im Gültigkeitsbereich der Richtlinie erstellt, und die ursprüngliche Variable wird nicht aktualisiert. Wenn Sie die textarea
an die Variable der Eltern binden, wie von Mathew vorgeschlagen, wird Angular immer an die richtige Variable binden und das Problem ist weg.
<textarea ng-model="$parent.myText"></textarea>
hoffen, dass dies die Dinge klar für andere Personen auf diese Frage kommen und und denkt „WTF, ich bin nicht ng-if oder durch eine andere in meinem Fall mit!“ wie ich es tat, als ich hier gelandet;)
Update: Verwenden Sie Controller-wie Syntax
wollte dies vor langer hinzufügen, aber es hatte keine Zeit zu tun. Dies ist der moderne Stil der Controller zu bauen und sollte anstelle der oben genannten $parent
Sachen verwendet werden. Lesen Sie weiter, um herauszufinden, wie und warum.
Seit AngularJS 1.2 gibt es die Möglichkeit, das Controller-Objekt direkt zu referenzieren, anstatt das Objekt $scope
zu verwenden.
für ihre Zustände
<div ng-controller="MyController as myc"> [...] </div>
Beliebte Routing-Module (d UI Router) bieten ähnliche Eigenschaften: Dies kann durch Verwendung dieser Syntax in HTML-Markup erreicht werden. Für UI-Router verwenden Sie die folgende in Ihrem Zustand Definition:
[...]
controller: "MyController",
controllerAs: "myc",
[...]
Das uns das Problem mit verschachtelten oder falsch adressierte Bereiche umgehen hilft. Das obige Beispiel würde auf diese Weise erstellt werden. Zuerst der JavaScript-Teil. Einfach gesagt, verwenden Sie einfach nicht die $scope
Referenz, um Ihren Text festzulegen, verwenden Sie einfach this
, um die Eigenschaft direkt an das Controller-Objekt anzuhängen.
angular.module('myApp').controller('MyController', function() {
this.myText = 'Dummy text';
});
Das Markup für die textarea
mit Controller-wie Syntax würde wie folgt aussehen:
<textarea ng-model="myc.myText"></textarea>
Dies ist der effizienteste Weg, Dinge wie dies heute zu tun, weil es das Problem mit verschachtelten Bereichen löst damit wir zählen können, wie viele Schichten wir an einem bestimmten Punkt tief sind. Die Verwendung mehrerer verschachtelter Direktiven innerhalb von Elementen mit einer Direktive ng-controller
könnte bei der Verwendung der alten Art der Referenzierung von Bereichen zu so etwas führen. Und das will niemand wirklich den ganzen Tag machen!
<textarea ng-model="$parent.$parent.$parent.$parent.myText"></textarea>
Große ausführliche Erklärung! Sehr hilfreich! – Wolfgang
rettete mein Leben. Danke für die Erklärung! – NewestStackOverflowUser