Ten problem się dla mnie, gdy nie używam dyrektywy ng-if
dotyczącej elementów otaczających element textarea. Podczas gdy rozwiązanie Mathew jest poprawne, powód wydaje się być inny. Wyszukiwanie tego problemu wskazuje na ten post, więc postanowiłem to udostępnić.
Jeśli spojrzeć na dokumentacji angularjs tutaj https://docs.angularjs.org/api/ng/directive/textarea, można zobaczyć, że kątowa dodaje własną dyrektywę o nazwie <textarea>
że „przesłonięcia” domyślnym HTML textarea
elementem. To jest nowy zakres, który powoduje cały bałagan.
Jeśli masz zmienną jak
$scope.myText = 'Dummy text';
w kontrolerze i wiążą że do elementu textarea
jak tego
<textarea ng-model="myText"></textarea>
angularjs będzie szukać tej zmiennej w zakresie dyrektywy. Nie ma go i dlatego idzie do rodzica. Zmienna jest tam obecna, a tekst jest wstawiany do textarea
. Zmieniając tekst w textarea
, Angular NIE zmienia zmiennej rodzica. Zamiast tego tworzy nową zmienną w zakresie dyrektywy, a zatem pierwotna zmienna nie jest aktualizowana. Jeśli zwiążesz textarea
ze zmienną rodzicielską, jak sugeruje Mathew, Angular zawsze będzie wiązał się z właściwą zmienną, a problem zniknął.
<textarea ng-model="$parent.myText"></textarea>
nadzieję, że to jasne rzeczy dla innych osób przybywających do tego pytania i i pomyśleć „WTF, nie używam ng-if lub jakakolwiek inna dyrektywa w moim przypadku!” tak jak ja, kiedy pierwszy raz wylądował tutaj;)
Aktualizacja: Użyj kontrolera jako składni
chcielibyście dodać to na długo przed, ale nie znalazł czasu, aby to zrobić. Jest to nowoczesny styl budowania kontrolerów i powinien być używany zamiast powyższych rzeczy. Czytaj dalej, aby dowiedzieć się, , jak i dlaczego .
Od AngularJS 1.2 istnieje możliwość bezpośredniego odniesienia do obiektu kontrolera zamiast korzystania z obiektu $scope
. Można to osiągnąć za pomocą tej składni znaczników HTML:
<div ng-controller="MyController as myc"> [...] </div>
popularnych modułów routingu (tzn UI Router) zapewniają podobne właściwości do swoich państw. Dla UI Router użyć następujących definicji państwa:
[...]
controller: "MyController",
controllerAs: "myc",
[...]
To pomaga nam obejście problemu z zagnieżdżonych lub niewłaściwie skierowane zakresów. Powyższy przykład zostanie skonstruowany w ten sposób. Najpierw część JavaScript. Prosto, po prostu nie używaj referencji $scope
, aby ustawić tekst, wystarczy użyć this
, aby dołączyć właściwość bezpośrednio do obiektu kontrolera.
angular.module('myApp').controller('MyController', function() {
this.myText = 'Dummy text';
});
Znaczniki dla textarea
z kontrolera jako składni będzie wyglądać następująco:
<textarea ng-model="myc.myText"></textarea>
Jest to najbardziej skuteczny sposób, aby robić rzeczy, jak ten dzisiejszy, ponieważ rozwiązuje problem z zagnieżdżonych zakresów sprawiają, że policzymy ile warstw jest głęboko w pewnym punkcie. Używanie wielu dyrektyw zagnieżdżonych wewnątrz elementów za pomocą dyrektywy ng-controller
mogło prowadzić do czegoś podobnego w przypadku korzystania ze starego sposobu odwoływania się do zakresów. I nikt tak naprawdę nie chce tego robić przez cały dzień!
<textarea ng-model="$parent.$parent.$parent.$parent.myText"></textarea>
Bardzo szczegółowe wyjaśnienie! Bardzo przydatne! – Wolfgang
Uratowałem moje życie. Dziękuję za wyjaśnienie! – NewestStackOverflowUser