Angular ng-model未绑定到文本区域。

21 浏览
0 Comments

Angular ng-model未绑定到文本区域。

这是我的plnkr链接: http://plnkr.co/edit/n8cRXwIpHJw3jUpL8PX5?p=preview 你需要点击一个li元素,然后表单会出现。输入一个随机字符串然后点击 'add notice' 按钮。你将得到一个undefined而不是textarea中的文本。

标记:

  • {{ ticket.text }}

JS部分:

$scope.createNotice = function(ticket){
   alert($scope.noticeText);
}

返回的是'undefined'。我注意到当使用angular-ui的ui-if时,这个方法不起作用。有什么解决方法吗?如何修复这个问题?

0
0 Comments

问题的原因是直接将ng-model绑定到作用域变量上,而不是绑定到作用域变量的属性上。解决方法是将textarea绑定到作用域变量的属性上。

在控制器中,创建一个作用域变量notice,并给它一个属性text:

$scope.notice = {text: ""}

在模板中,将textarea绑定到notice对象的text属性上:

<textarea ng-model="notice.text"></textarea>

这种方法在Angular 1.5中对我有效。我相信这个奇怪的限制在早期的版本中也有效,直接绑定到作用域变量上...

这种解决方法比使用$parent.notice更好!!!

你的解决方法有效。有没有解释为什么直接绑定失败的原因?

这个解决方法有效。使用$parent的方法不起作用。

0
0 Comments

Angular ng-model not binding to textarea这个问题的原因是由于在textarea元素周围的元素上没有使用ng-if指令。解决方法是将textarea绑定到父级变量上。

AngularJS文档中提到,Angular会添加自己的textarea指令来“覆盖”默认的HTML textarea元素。这就是导致问题的原因。

如果你在控制器中有一个变量$scope.myText = 'Dummy text';,并将其绑定到textarea元素上,AngularJS会在指令的作用域中查找该变量。如果没有找到,它会向上级的作用域查找。当在textarea中更改文本时,Angular不会更改父级变量,而是在指令的作用域中创建一个新的变量,因此原始变量不会被更新。如果将textarea绑定到父级变量上,Angular将始终绑定到正确的变量,问题就解决了。

另一种解决方法是使用controller-as语法。从AngularJS 1.2开始,可以直接引用控制器对象而不是使用$scope对象。在HTML标记中使用controller-as语法可以实现这一点。这种语法可以绕过嵌套或错误引用作用域的问题。

使用controller-as语法,JavaScript部分的代码如下:

angular.module('myApp').controller('MyController', function () {
    this.myText = 'Dummy text';
});

textarea元素的标记如下:


这是目前最有效的做法,因为它解决了嵌套作用域的问题,避免了在使用旧的作用域引用方式时的层级嵌套问题。

0
0 Comments

问题出现的原因是在ui-if部分。Angular-ui为该指令内的任何内容创建了一个新的作用域,因此要访问父作用域,你必须这样做:

<textarea ng-model="$parent.noticeText"></textarea>

而不是

<textarea ng-model="noticeText"></textarea>

这样做可以解决问题。谢谢你。你能说一下为什么textarea会发生这种情况吗?

0