此問題發生而不是在textarea元素周圍的元素上使用ng-if
指令。雖然Mathew的解決方案是正確的,但理由似乎是另一回事。尋找這個問題指向這個職位,所以我決定分享這個。
如果您看一下這裏的AngularJS文檔https://docs.angularjs.org/api/ng/directive/textarea,您會發現Angular添加了自己的僞指令<textarea>
,它「覆蓋」了默認的HTML textarea
元素。這是導致整個混亂的新範圍。
如果你有一個像
$scope.myText = 'Dummy text';
一個變量在你的控制器,並綁定該到textarea
元素這樣
<textarea ng-model="myText"></textarea>
AngularJS將尋找在指令範圍變量。它不在那裏,因此他走到了父母身邊。該變量出現在那裏,文本被插入到textarea
中。更改textarea
中的文字時,Angular不會更改父母的變量。相反,它會在指令的作用域中創建一個新變量,因此原始變量不會更新。如果您將textarea
綁定到父變量,如Mathew所建議的那樣,Angular將始終綁定到正確的變量,問題就消失了。
<textarea ng-model="$parent.myText"></textarea>
希望這將清除的事情了其他人來這個問題,並認爲「跆拳道,我沒有使用NG-if或在我的情況下,任何其他指令!」像我一樣,當我第一次在這裏登陸;)
更新:使用控制器作爲語法
就想很久以前添加這個,但沒有找到時間去做。這是建築控制器的現代風格,應該用來代替上面的$parent
。請繼續閱讀以找出如何和爲什麼。
由於AngularJS 1。2有能力直接引用控制器對象,而不是使用$scope
對象。這可以通過在HTML標記使用此語法來實現:
<div ng-controller="MyController as myc"> [...] </div>
熱門路由模塊(即UI路由器),用於它們的狀態提供相似的性質。對於UI路由器使用了下面在你的狀態定義:
[...]
controller: "MyController",
controllerAs: "myc",
[...]
這有助於我們與嵌套或不正確地處理範圍來規避這個問題。上面的例子將以這種方式構建。首先是JavaScript部分。直截了當地說,你簡單地不要使用$scope
引用來設置你的文本,只需使用this
將屬性直接附加到控制器對象。
angular.module('myApp').controller('MyController', function() {
this.myText = 'Dummy text';
});
用的標記爲textarea
控制器的語法是這樣的:
<textarea ng-model="myc.myText"></textarea>
這是做的事情是今天這個樣子是最有效的方式,因爲它解決了嵌套範圍問題使我們能夠計算出在某個特定點上我們有多少層。在使用舊的引用範圍方式時,在ng-controller
指令的元素中使用多個嵌套指令可能會導致類似的情況。沒有人真的想整天這樣做!
<textarea ng-model="$parent.$parent.$parent.$parent.myText"></textarea>
大詳細的解釋!很有用! – Wolfgang 2015-06-29 12:21:55
拯救了我的生命。感謝您的解釋! – NewestStackOverflowUser 2015-12-01 14:59:58