我正在编写一个简单的AngularJS控制器,用于跟踪所选复选框的数量。试图避免$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
的控制器中收到错误:
TypeError: Cannot read property 'target' of undefined
我创建了一个用于重新创建的Plunk:http://plnkr.co/edit/qPzETejmMHHZCQ2sV2Sk?p=info
如果有人有任何想法或建议,我将非常感激。
非常感谢!
答案 0 :(得分:45)
ng-change
函数不允许将$event
作为变量传递。
来自AngularJS官方github回购的合作者:
ng-change不是处理变更事件的指令(我意识到 鉴于名称,这是令人困惑的,但实际上是相反的 当ngModelController。$ setViewValue()被调用时通知 值变化(因为ng-change会为其添加一个监听器 $ viewChangeListeners集合)。所以这是预期的。
您可以阅读更多相关信息ng-change doesn't get the $event argument
您如何解决您的要求?
只需将item.selected
传递给ng-change函数并检查其值。
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
进行测试