angularjs复选框ng-checked不起作用

时间:2015-08-19 12:47:45

标签: angularjs angularjs-ng-checked

我有以下代码: -

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js"></script>
</head>
<body ng-app="app" ng-controller="ctrl" ng-init="init()">
  <div class="container" style="width:400px">
    <div class="panel panel-default">
      <div class="panel-body">
        <form>
            <div class="form-group">
              <label for="selectedBasket">Select basket :</label>
              <select id="selectedBasket" class="form-control" ng-model="selectedBasket" ng-options="b.name for b in baskets">
              </select>
            </div>
            <div ng-repeat="f in fruits" class="checkbox">
              <label>
                <input type="checkbox" value="" ng-checked="selectedBasket !== null && selectedBasket.items.indexOf(f) !== -1">
                  {{ f }}
              </label>
            </div>
        </form>     
      </div>
    </div>
  </div>

  <script>
  var app = angular.module('app', []);
  app.controller('ctrl', function($scope) {
    $scope.init = function() {
      $scope.baskets = [{'name': 'mary', 'items': ['apple', 'orange']}, {'name': 'jane', 'items': ['banana']}];
      $scope.fruits = ['apple', 'banana', 'cherry', 'orange', 'watermelon'];
      $scope.selectedBasket = null;
    };
  });
  </script>
</body>
</html>

如果我选择Mary或Jane,我可以正确地看到他们检查篮子里的正确物品。但是,如果我手动检查所有水果,然后查看玛丽或简,它不会排除不在其篮子中的项目。为什么ng-checked失败?

奖金问题,最好的做法是将selectedBasket设置为null并在指令中检查null,假设我不想作为默认值,是否有更好的方法?

2 个答案:

答案 0 :(得分:1)

您的复选框中没有ng-model,因此您的手动操作未在任何地方注册 ng-checked仅用于制作“奴隶”复选框,不需要手动操作。 我的猜测是你应该使用初始化为ng-check值的ng-model而不是使用ng-checked。

如果你想保持你的ng检查你可以做的是:

<input type="checkbox" ng-click="selectedBasket.items.push(f)" ng-checked="selectedBasket !== null && selectedBasket.items.indexOf(f) !== -1">

实际上它仍然是错的...必须累,在你的ng-click中使用toogle功能添加或删除项目应该更好...

答案 1 :(得分:0)

与ng-check有同样的问题,尝试了一切,但没有任何效果。我想在点击2时控制已检查项目的数量,因此我使用了通过ng-click发送的$ Event并禁用它。

以下是示例代码:

 <input type="checkbox" ng-click="toggleCheck($event, product._id);"
  ng-checked="isChecked(product._id)">

   $scope.toggleCheck($event, productId){
        if ( $scope.featuredProducts.indexOf(productId) === -1) {
            if ($scope.featuredProducts.length < 2) {
                $scope.featuredProducts.push(productId);
            }else {
                $event.preventDefault();
                $event.stopPropagation();
            }
        } else {
             $scope.featuredProducts.splice( $scope.featuredProducts.indexOf(productId), 1);
        }
    }

    $scope.isChecked(productId){
        return ($scope.featuredProducts.indexOf(productId) !== -1);
    }