我正在编写一个简单的AngularJS控制器,该控制器跟踪已选中复选框的数量。尝试避免$scope.$watch使用ng- change总计数递增/递减。
$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>
控制器片段
$scope.updateTotal = function($event) { var checkbox = $event.target; if (checkbox.checked) { $scope.totalSelected++; } else { $scope.totalSelected--; } }
我在尝试访问的控制器中不断收到错误消息$event.target:
$event.target
TypeError: Cannot read property 'target' of undefined
我创建了一个用于重新创建的Plunk: http ://plnkr.co/edit/qPzETejmMHHZCQ2sV2Sk?p=info
如果有人有任何想法或建议,我将不胜感激。
非常感谢你!
ng-change函数不允许$event作为变量传递。
ng-change
$event
来自AngularJS官方github回购中的合作者:
ng-change不是用于处理change事件的指令(我知道给定名称会造成混淆),但实际上是在调用ngModelController。$ setViewValue()并更改值时得到通知(因为ng-change添加了一个侦听器)到$ viewChangeListeners集合中)。所以这是预期的。
您可以阅读更多有关ng-change的$ event参数的信息
您如何解决您的要求?
只需传递item.selected给ng-change函数并检查其值即可。
item.selected
的HTML
<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--; } }
更新
您可以在此 plnkr中对其进行测试