【问题标题】:Select All checkbox to select nested angular ng-repeat checkboxes?全选复选框以选择嵌套的角度 ng-repeat 复选框?
【发布时间】:2015-03-04 00:07:14
【问题描述】:

我有一系列嵌套的 ng-repeat 复选框,其结构如下:

  • 复选框
    • 国家
    • 国家
    • 全选
  • 复选框
    • 国家
    • 国家
    • 全选

每个组中的“全选”应选中该组中的所有“国家”复选框。

你可以在这里看到它的实际效果:http://plnkr.co/edit/rBIv9lfOr5MASPia7ORS?p=preview

内部复选框由主json中的数组生成:

  $scope.carriers = 
  [{
    "name": "UPS",
    "selected": false,
    "hasPaymentOptions": false,
    "isSelectable": true,
    "value": "",
    "countries": [
        "USA","UK","Canada","Germany","Australia"
     ]
   },etc

并且在嵌套的 ng-repeat 中:

<!-- main list of carrier checkboxes -->
    <div ng-repeat="c in partnerent.carriers.carriers" class="spacer-top-md spacer-bottom-md">
      <div class="carrier spacer-bottom-sm">
        <div class="checkbox-inline">
          <label>
            <input type="checkbox" name="{{c.name | slug}}" ng-model="c.selected"> {{c.name}}
          </label>
        </div>
        <!-- inner checkboxes for countries -->
        <ul class="entitlement-countries list-inline">
          <li ng-repeat="ec in c.countries">
            <div class="checkbox-inline">
              <label>
                <input type="checkbox" name="{{ec | slug}}"> {{ec}}
              </label>
            </div>
            </li>
            <li ng-if="c.countries.length > 0">
              <div class="checkbox-inline">
                <label>
                  <input type="checkbox" name="{{ec | slug}}_selectall"> Select all
                </label>
              </div>
            </li>
        </ul>

一切正常,但我的问题是如何让这些“全选”复选框选择他们的国家组?我发现的大多数解决方案和指令都涉及该模型,并且通常用于一组复选框,其中我在 ng-repeat 中有几个。

【问题讨论】:

    标签: javascript angularjs checkbox


    【解决方案1】:

    我的答案很简单:http://plnkr.co/edit/d4cV1VP5iPj58ePGvZNR

    注意:我没有改变所有的运营商,只是 Plunker 中的第一个

    我将如何解决这个问题是在 selectAll 和子复选框上使用某种 ng-change 方法:

    <ul class="entitlement-countries list-inline">
        <li ng-repeat="ec in c.countries">
            <div class="checkbox-inline">
                <label>
                    <input type="checkbox" name="{{ec.name | slug}}" ng-model="ec.selected" ng-change="checkAllCountriesSelected(c)"> {{ec}}
                </label>
            </div>
        </li>
        <li ng-if="c.countries.length > 0">
            <div class="checkbox-inline">
                <label>
                    <input type="checkbox" name="{{c.name | slug}}_selectall" ng-model="c.selectAll" ng-change="checkAllCountriesSelected(c)"> Select all
                </label>
            </div>
        </li>
    </ul>
    

    数据模型会稍微改变为:

    $scope.carriers = 
      [{
        "name": "UPS",
        "selected": false,
        "selectAll": false,
        "hasPaymentOptions": false,
        "isSelectable": true,
        "value": "",
        "countries": [
            { name: "USA", selected: false },
            { name: "UK", selected: false },
            { name: "Canada", selected: false },
            { name: "Germany", selected: false },
            { name: "Australia", selected: false }
         ]
       },etc
    

    我会添加更改方法:

    $scope.checkCountryToggled = function checkCountryToggled (carrier) {
        var carrierCountriesSelected = getSelectedCountries(carrier);
    
        if (carrierCountriesSelected.length === carrier.countries.length) {
            carrier.selectAll = true;
        } else {
            carrier.selectAll = false;
        }
    };
    
    function getSelectedCountries (carrier) {
        var selectedCountries = filterFilter(carrier.countries, function (country) {
            return country.selected;
        });
    
        return selectedCountries || [];
    }
    
    $scope.checkSelectAllToggled = function (carrier) {
        if (carrier.selectAll) {
             selectAllCountries(carrier);
        }
    };
    
    function selectAllCountries (carrier) {
        angular.forEach(carrier.countries, function (country) {
            country.selected = true;
        });
    }        
    

    【讨论】:

    • 非常好。谢谢。我最初很困惑,因为当然每个运营商都有自己的国家/地区阵列。没想到做个函数,传个数组。
    • 我在 Angular 的早期遇到了很多这样的事情......像 ng-checked 和 ng-model 这样的东西往往会让你的大脑搞砸如何处理不断变化的值......ng- change 是一个很好的指令,因为它允许您仅在模型更改后评估您的模型...如果您使用 ngModelOptions(在 1.3 中可用)会派上用场
    【解决方案2】:

    使用ng-checked 指令选择所有复选框。

    <ul class="entitlement-countries list-inline">
      <li ng-repeat="ec in c.countries">
        <div class="checkbox-inline">
          <label>
            <input type="checkbox" name="{{ec | slug}}" ng-checked="c.countries.selectAll"> {{ec}}
          </label>
        </div>
        </li>
        <li ng-if="c.countries.length > 0">
          <div class="checkbox-inline">
            <label>
              <input type="checkbox" name="{{ec | slug}}_selectall" ng-model="c.countries.selectAll"> Select all
            </label>
          </div>
        </li>
    </ul>
    

    这里是更新的 plnkr:http://plnkr.co/edit/o2NOBmFYZMtfkBu4lTrs?p=preview

    【讨论】:

    • 这将一直有效,直到他必须检索选择了哪个国家,在这种情况下ng-checked 不会更改单个国家的模型并返回错误模型
    • 这并不能解决问题,因为每当取消选择全选时,所有国家/地区都将被取消选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多