Javascript 带有$event.target的AngularJS复选框ng更改问题
我正在编写一个简单的AngularJS控制器,用于跟踪选中复选框的数量。试图避免使用Javascript 带有$event.target的AngularJS复选框ng更改问题,javascript,angularjs,checkbox,Javascript,Angularjs,Checkbox,我正在编写一个简单的AngularJS控制器,用于跟踪选中复选框的数量。试图避免使用$scope.$watch,而是使用ng change增加/减少总计数 HTML: <form ng-controller="MainCtrl"> <table> <tr ng-repeat="item in data"> <td> <input type="checkbox" value="{{
$scope.$watch
,而是使用ng change
增加/减少总计数
HTML:
<form ng-controller="MainCtrl">
<table>
<tr ng-repeat="item in data">
<td>
<input type="checkbox"
value="{{item.id}}"
ng-model="item.selected"
ng-change="updateTotal($event)"> {{item.name}}
</td>
</tr>
</table>
<p>
Total checked: {{totalSelected}}
</p>
</form>
我在尝试访问$event.target的控制器中不断收到错误:
TypeError: Cannot read property 'target' of undefined
我创建了一个用于重新创建的Plunk:
如果有人有任何想法或建议,我将不胜感激
多谢各位 ng change
函数不允许将$event
作为变量传递
来自AngularJS官方github repo的合作者:
ng change不是处理变更事件的指令(我意识到
这让人困惑),但实际上是
调用ngModelController.$setViewValue()时通知,并且
值更改(因为ng更改会将侦听器添加到
$viewChangeListeners集合)。所以这是意料之中的
你可以阅读更多关于它的内容
您如何解决您的需求?
只需将所选的项传递给ng change函数并检查其值
HTML
已更新
你可以在这里测试它,在这里@levi是正确的。但更合乎逻辑的是,避免在控制器中选中复选框。改为发送项目
(或项目。已选择
)。@DRobinson这很有意义,谢谢。您的建议是正确的,不要将其与DOM紧密结合。@levi,如果我们必须在ng change
中停止事件传播,我们如何才能做到这一点?这看起来是非常优雅的解决方案,它符合DRobinson不使用checkbox.checked的建议。我回家后会试试的,谢谢@PhilipTenn我为您准备了一个plnkr,请检查我的答案。如果我们想将其与模型值分离,该怎么办?
TypeError: Cannot read property 'target' of undefined
<input type="checkbox"
value="{{item.id}}"
ng-model="item.selected"
ng-change="updateTotal(item.selected)"> {{item.name}}
$scope.updateTotal = function(item_selected) {
if (item_selected) {
$scope.totalSelected++;
}
else {
$scope.totalSelected--;
}
}