Javascript 使用'时出错;ControllerAs';但使用'时效果良好$范围';在ng中重复复选框

Javascript 使用'时出错;ControllerAs';但使用'时效果良好$范围';在ng中重复复选框,javascript,angularjs,checkbox,angularjs-ng-repeat,angularjs-controlleras,Javascript,Angularjs,Checkbox,Angularjs Ng Repeat,Angularjs Controlleras,当使用“$scope”语法时,选中单个复选框会正确输出其相应的对象名称,但当对同一代码应用“ControllerAs”语法时,选中单个复选框会异常生成错误 $scope.users = [{.....}] //using $scope syntax $scope.selected = []; $scope.exist = function(item) { return $scope.selected.indexOf(item) > -1; } $scope.toggleSelecti

当使用“$scope”语法时,选中单个复选框会正确输出其相应的对象名称,但当对同一代码应用“ControllerAs”语法时,选中单个复选框会异常生成错误

$scope.users = [{.....}] //using $scope syntax
$scope.selected = [];

$scope.exist = function(item) {
  return $scope.selected.indexOf(item) > -1;
}
$scope.toggleSelection = function(item) {
  var idx = $scope.selected.indexOf(item);
  if (idx > -1) {
    $scope.selected.splice(idx, 1);
  } else {
    $scope.selected.push(item);
  }
}
上述代码在ControllerAs中的表示

vm.users = [{....}] //Using 'Controller As' Syntax
vm.selected = [];

vm.exist = function(item) {
  return vm.selected.indexOf(item) > -1;
}
vm.toggleSelection = function(item) {
  var idx = vm.selected.indexOf(item);
  if (idx > -1) {
    vm.selected.splice(idx, 1);
  } else {
    vm.selected.push(item);
  }
}
chrome开发者工具中返回错误

TypeError:vm.selected.indexOf不是函数 位于GridController.vm.exist(GridController.js:37)

演示控制器为

演示$Scope


请注意,当控制器作为语法应用于此上下文时,可能会出现什么问题,或者这可能是一个错误,谢谢在您的plunkr中,您将
vm.selected
绑定到一个复选框;这告诉angular将其设置为布尔值。当您尝试在其上调用
.indexOf
时,它会失败,因为带有ng模型的复选框默认为
true
false


请参见此处:

您的
切换选择
功能所做的工作与
ng模型
类似,只是
ng模型
$scope
代码中为每个
用户
选择了一个
属性,但是,由于JavaScript原型继承如何处理原语,因此在控制器中选择了一个单数的
vm.selected
属性作为版本。这是一个主要的例子,说明在绑定中不使用
会导致意外的结果

在本例中,
ng模型
正在将
vm.从数组中选择的
转换为布尔值,这将级联到
exist
函数中的错误,该函数现在看到的布尔值没有
.indexOf
属性

在这种情况下,您的
toggleSelection
代码正在执行其余代码逻辑所需的操作,而实际上不需要
ng model