0

できるだけ多くの質問をチェックし、いくつかの答えを見つけましたが、最後の段階で行き詰まっています。私が見つけたもののほとんどは、チェックされたもの以外をすべてオフにする方法ではなく、チェックボックスで物事をオンにする方法をカバーしています。

各行に 2 ~ 3 個のチェックボックスがあるテーブルがあります。目的は、1) 1 つのボックスをチェックすると、他のすべての行のチェックボックスが無効になります (唯一のオプションは同じ行のチェックボックスです)、次に 2) 同じ行の 2 番目のボックスをチェックすると、3 番目のチェックボックスがある場合です。 、それも無効になり、最後に 3) 2 番目のボックスをオンにすると、送信ボタンが有効になります。私は #1 が機能するようになりました (ただし、いくつかのルールを破ったと思います)。正しいが、おそらく十分に近い)。頭が痛いのは、3 つ並んだボタンの 3 番目のボタンを無効にすることです。

AngularJSディレクティブのチェックボックスのクリックに応答する方法からVBAholeのデモを使用しましたか? それは私にいくらかの方法をもたらしました。これが作業中のplnkrです。

html:

<tr ng-repeat="e in entities" ng-class="{active : isChecked(e.id) }" id="row{{e.id}}">
    <td>
        <label>
            <input type="checkbox" name="checkbox{{e.id}}" ng-disabled="checkThis(e.id, e.box1id)" ng-checked="isChecked(e.box1id)" ng-click="updateCheck($event, e.id)" />
            {{e.box1}}
        </label><br />
        <label>
            <input type="checkbox" name="checkbox{{e.id}}" ng-disabled="checkThis(e.id, e.box2id)" ng-checked="isChecked(e.box2id)" ng-click="updateCheck($event, e.id)" />
            {{e.box2}}
        </label><br />
        <label>
            <input type="checkbox" name="checkbox{{e.id}}" ng-disabled="checkThis(e.id, e.box3id)" ng-checked="isChecked(e.box3id)" ng-click="updateCheck($event, e.id)" />
            {{e.box3}}
        </label>
    </td>
    <td>
        <button disabled ng-disabled="!isChecked(e.id)">submit</button>
    </td>
</tr>

そして、これがコントローラーです(まだディレクティブに分割していません):

var app = angular.module('myApp', []);
app.controller('MyCtrl', function ($scope) {
    $scope.entities = [
        { id: 10, name: "boxrow10", box1: "red11", box1id: 11, box2: "blue12", box2id: 12, box3: "blue13", box3id: 13 },
        { id: 20, name: "boxrow20", box1: "red21", box1id: 21, box2: "blue22", box2id: 22, box3: "blue23", box3id: 23  },
        { id: 30, name: "boxrow30", box1: "red31", box1id: 31, box2: "blue32", box2id: 32, box3: "blue33", box3id: 33  }
    ];

    $scope.checked = [];
    var updateChecked = function (action, id) {
        if (action == 'add') $scope.checked.push(id);
        if (action == 'remove') $scope.checked.splice($scope.checked.indexOf(id), 1);
    }

    $scope.updateCheck = function ($event, id) {
        var checkbox = $event.target;
        var action = (checkbox.checked ? 'add' : 'remove');
        updateChecked(action, id);
    };

    $scope.isChecked = function (id) {
        return $scope.checked.indexOf(id) >= 0;
    };

    $scope.checkThis = function (id, boxid) {
        var check = $scope.checked;
        var current = id;
        if (check != current && check.length == 1) {
            return current;
        } else if (check.length == 2) {
            for (var i = check.length - 2; i >= 0; i--) {
                if (check[i] === current) {
                    check.splice(i, 1);
                }
            }
            return current;
        }
    };
});

最後のビット (2 番目の if ステートメント) で本当にスパゲッティのようになり、電流を返すと実際に何かがどのように変化するかわかりませんが、それを削除すると、無効化機能が得られません。問題は (特に) 2 つのボックスをオンにして 1 つのチェックを外すと、すべての行のすべてのボックスが無効のままになるのではなく、再び有効になることです (ボックスがまだチェックされているため)。

(jqueryで簡単にできることは知っていますが、私の指示ではストリームを混合しないようになっているため、純粋な角度です。)私はこれに数日間頭を悩ませてきました。どんな啓発も大歓迎です。ティア!

4

2 に答える 2

3

angularjs のみを使用して非常に簡単に実行できます。

これが実際の例です: http://plnkr.co/GsZWG1mEcKsB7zpz6Spy

すべては ng-disabled とスコープ内のいくつかのメソッドに基づいています。

各チェックボックスは、ID とエンティティを使用してコントローラーのトグル メソッドを呼び出します。

コントローラーは、選択されたエンティティとボックスを変数に保持して、正しいチェックボックスを無効にします。

チェックすることがいくつかあるので、チェックボックスを無効にする必要があるかどうかを知るために、コントローラーにユーティリティメソッドを追加しました...

コントローラーは次のとおりです。

app.controller('MyCtrl', function ($scope) {
        $scope.entities = [
      { id: 10, name: "boxrow10", box1: "red11", box1id: 11, box2: "blue12", box2id: 12, box3: "blue13", box3id: 13 },
      { id: 20, name: "boxrow20", box1: "red21", box1id: 21, box2: "blue22", box2id: 22, box3: "blue23", box3id: 23  },
      { id: 30, name: "boxrow30", box1: "red31", box1id: 31, box2: "blue32", box2id: 32, box3: "blue33", box3id: 33  }
    ];
    $scope.selectedEntity = null;
    $scope.selectedBoxes = [];

    $scope.toggleChecked = function(entity, boxid) {
      if (entity == $scope.selectedEntity) {
        if ($scope.selectedBoxes.length == 1 && $scope.selectedBoxes[0]  == boxid) {
          $scope.selectedEntity  = null;
          $scope.selectedBoxes = [];
          return;
        } else if ($scope.selectedBoxes.length > 0) {
          for (var box in $scope.selectedBoxes) {
            if ($scope.selectedBoxes[box] == boxid) {
              $scope.selectedBoxes.splice(box, 1);
              return;
            }
          }
        }
      }
      $scope.selectedEntity = entity;
      $scope.selectedBoxes.push(boxid);
    };

    $scope.inSelected = function(id) {
      for (var box in $scope.selectedBoxes)  {
        if ($scope.selectedBoxes[box] == id) 
          return true;
      }
      return false;
    };

    $scope.isDisabled = function(e, id) {
      return ($scope.selectedEntity 
            && $scope.selectedEntity != e)
            ||  ($scope.selectedBoxes.length >= 2 
            && !$scope.inSelected(id));
    };
});

最後に、各チェックボックスは次のようになります。

<label>
  <input type="checkbox"  ng-click="toggleChecked(e, e.box3id)" ng-disabled="isDisabled(e, e.box3id)" />
  {{e.box3}}
</label>

plunker でわかるように、このソリューションは、面倒なコードなしで 3 つの要件に答えます...おそらく、ロジックにコントローラーの代わりにサービスを使用することで改善される可能性がありますが、このバージョンの方が理解しやすいです。

于 2013-08-23T07:17:13.870 に答える
1

あなたのコードとplnkrを少し修正しました。あなたが抱えている問題はここで解決されますが、完璧ではありません。2 つの問題があります。

I. 選択が 2 に達すると、チェックボックスが無効になります。

Ⅱ.すべての送信ボタンが有効になっていますが、主に選択が更新されていない$scope.submitDisabledため、正しく機能していません。$scope.updateCheck

これらをデバッグして解決できると思います:)。あなたは私がやったことを必要としていまし$scope.isEnabledた。

var app = angular.module('myApp', []);

app.controller('MyCtrl', function ($scope) {
  $scope.entities = [
    { id: 10, name: "boxrow10", box1: "red11", box1id: 11, box2: "blue12", box2id: 12, box3: "blue13", box3id: 13 },
    { id: 20, name: "boxrow20", box1: "red21", box1id: 21, box2: "blue22", box2id: 22, box3: "blue23", box3id: 23  },
    { id: 30, name: "boxrow30", box1: "red31", box1id: 31, box2: "blue32", box2id: 32, box3: "blue33", box3id: 33  }
  ];

  $scope.checked = [];
  $scope.checkedCount = 0;
  var updateChecked = function (action, id) {
    if (action == 'add') {
      $scope.checked.push(id);
      $scope.checkedCount++;
    }
    else if (action == 'remove') {  // Unnecessary check?
      $scope.checked.splice($scope.checked.indexOf(id), 1);
      $scope.checkedCount--;
    }
  };

  $scope.updateCheck = function ($event, id) {
    var checkbox = $event.target;
    var action = (checkbox.checked ? 'add' : 'remove');
    updateChecked(action, id);
  };

  $scope.isChecked = function (id) {
    return $scope.checked.indexOf(id) >= 0;
  };

  $scope.isEnabled = function (rowId, boxid) {
    switch($scope.checkedCount) {
      case 2: return false;
      case 1: return $scope.checked[0] == rowId;
      case 0: return true;
    }
  };

  $scope.submitDisabled = function (rowId) {
    return !($scope.checkedCount == 2 && $scope.checked[0] == rowId);
  };
});

テンプレートは次のとおりです。

<!DOCTYPE html>
<html ng-app="myApp" ng-controller="MyCtrl">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.js" data-semver="1.0.7" data-require="angular.js@1.2.0-rc1"></script>
<link rel="stylesheet" href="style.css" />
<script src="script.js"></script>
</head>

  <body>
    <table>
      <tbody>
        <tr ng-repeat="e in entities" ng-class="{active : isChecked(e.id) }" id="row{{e.id}}">
          <td>
            <label>
             <input type="checkbox" name="checkbox{{e.id}}" ng-disabled="!isEnabled(e.id)" ng-checked="isChecked(e.box1id)" ng-click="updateCheck($event, e.id)" />
          {{e.box1}} 
        </label><br />
        <label>
          <input type="checkbox" name="checkbox{{e.id}}" ng-disabled="!isEnabled(e.id)" ng-checked="isChecked(e.box2id)" ng-click="updateCheck($event, e.id)" />
              {{e.box2}}
            </label><br />
            <label>
              <input type="checkbox" name="checkbox{{e.id}}" ng-disabled="!isEnabled(e.id)" ng-checked="isChecked(e.box3id)" ng-click="updateCheck($event, e.id)" />
              {{e.box3}}
            </label>
          </td>
          <td>
            <button ng-disabled="submitDiasabled(e.id)">submit</button>
          </td>
        </tr>
      </tbody>
    </table>
  </body>
</html>
于 2013-08-23T06:21:37.230 に答える