【问题标题】:AngularJS display array based off checkbox selection基于复选框选择的AngularJS显示数组
【发布时间】:2015-08-14 15:06:47
【问题描述】:

我有 4 个复选框,根据选择的一个/对,我希望在页面上显示一个特定的数组。我对 angularjs 比较陌生,所以我不确定如何让它工作。那么我该如何a)通过角度检查选择了哪个复选框,b)打印出特定的数组,以及c)如果选择了“什么都不做”,则会出现一条消息而不是数组。内容应该是动态的,所以如果我选择不同的复选框,内容也会改变。 http://codepen.io/MarkBond/pen/gpJWKe?editors=101“简单表单对象”只是为了显示当前布尔值不是应该出现的名称数组。

HTML

<html ng-app="myApp">
 .....
 <body ng-controller="FormController">
 <form>
  <div class="checkbox">
    <label>
      <input type="checkbox" name="displayOption" ng-model="formData.displayOption.fiftyMill"/>50 million
    </label>
  </div>
  <div class="checkbox">
    <label>
      <input type="checkbox" name="displayOption" ng-model="formData.displayOption.hundredMill" />100 million
    </label>
  </div>
  <div class="checkbox">
    <label>
      <input type="checkbox" name="displayOption" ng-model="formData.displayOption.statusQuo"/>Status Quo
    </label>
  </div>
  <div class="checkbox">
    <label>
      <input type="checkbox" name="displayOption" ng-model="formData.displayOption.doNothing"/>Do Nothing
    </label>
  </div>
  <div ng-repeat="ActionController as actionCtrl">
    <a>{{ page.name }}</a>
    {{ message }}
  </div>
</form>
</body>
</html>

AngularJS

angular.module('myApp', [])

.controller('FormController', ['$scope' ,function($scope) {

  // Just for outputting data
  $scope.formData = {};

    // Trying to place the boolean value of each checkbox into a variable
    var value1 = '$scope.fiftyMill';
    var value2 = '$scope.hundredMill';
    var value3 = '$scope.statusQuo';
    var value4 = '$scope.doNothing';

    // Checks to see which checkbox is selected then outputting array 
    // associated with selection 
    if (value1 === true || value2 === true) {
        this.page = groupOne
    } else if (value3 === true) {
        this.page = groupTwo
    } else if (value1 === true || value2 === true && value3 === true) {
        this.page = groupThree + groupOne + groupTwo
    }else{
        this.message = 'No Options'
    }

    // Array gtoups
    var groupOne = [
      { name: 'BudgetCharts'},
      { name: 'BudgetComparison'},
      { name: 'EDITBudgetAmounts'}
    ]

    var groupTwo = [
      { name: 'Optimize'},
      { name: 'ReviewAndAdjust'}
    ]

    var groupThree = [
        { name: 'Export'},
        { name: 'Import'},
        { name: 'Construction Program'},
        { name: 'ExportStrategies'}
    ]
}]);

更新了关于我当前代码如何使用可行的 codepen 的问题

【问题讨论】:

  • 您能否通过 JSFiddle 示例提供您的问题?
  • @FSou1 我也尝试过,但我对让它工作感到沮丧和困惑
  • @FSou1 更新了代码并添加了codepen
  • 那么,我回答你的问题了吗?
  • @FSou1 是的,我只需要调整你的答案以匹配我的答案并将其标记为正确

标签: javascript arrays angularjs checkbox angular-ngmodel


【解决方案1】:

我不确定您想要实现什么,但我可以像这样编写您的示例:http://codepen.io/anon/pen/xGNLJe?editors=101

解释:

(function(angular) {
  "use strict";

  angular
    .module('formApp', [])
    .controller('FormController', ['$scope', function($scope) {
      var groupOne = [
        { name: 'BudgetCharts'},
        { name: 'BudgetComparison'},
        { name: 'EDITBudgetAmounts'}
      ];

      var groupTwo = [
        { name: 'Optimize'},
        { name: 'ReviewAndAdjust'}
      ];

      var groupThree = [
        { name: 'Export'},
        { name: 'Import'},
        { name: 'Construction Program'},
        { name: 'ExportStrategies'}
      ];

      $scope.formData = {};

      $scope.$watch("formData.displayOption", function(displayOption) {
        if(displayOption) {
          var value1 = displayOption.fiftyMill,
              value2 = displayOption.hundredMill,
              value3 = displayOption.statusQuo,
              value4 = displayOption.doNothing;

          $scope.pages = null;
          $scope.message = null;

          if (value1 === true || value2 === true) {
            $scope.pages = groupOne;
          } else if (value3 === true) {
            $scope.pages = groupTwo;
          } else if (value1 === true || value2 === true && value3 === true) {
            $scope.pages = groupThree + groupOne + groupTwo;
          } else {
            $scope.message = 'No Options';
          }
        }
      }, true);
    }]);
})(angular);

所以,一步一步来:

  1. 删除ng-click:

如您所见,您的复选框标记现在如下所示:

<input type="checkbox" name="displayOption" ng-model="formData.displayOption.fiftyMill"/>

我删除了您的 ng-click 处理程序并使用 $scope.$watch (https://docs.angularjs.org/api/ng/type/$rootScope.Scope) 处理 ng-model 更新,如下所示:

$scope.$watch("formData.displayOption", function(displayOption) { ... }, true);

  1. 添加$scope.pages$scope.message变量,在代码中与之交互并在视图中显示。这是您的 $watch 函数的主体:

每次“观察”变量(在您的情况下为 formData.displayOption)发生变化时都会触发。

$scope.pages = null;
$scope.message = null;

if (value1 === true || value2 === true) {
    $scope.pages = groupOne;
} else if (value3 === true) {
    $scope.pages = groupTwo;
} else if (value1 === true || value2 === true && value3 === true) {
    //
    // Algorithm never goes here, because:
    // value1 === true || value2 === true, always goes to first if block
    // value3 === true, it goes to second if block
    // there aren't any other options to go here 
    //
    $scope.pages = groupThree + groupOne + groupTwo;
    //
    // groupThree, groupOne, groupTwo are arrays. If you plus
    // arrays in javascript like this: 
    // [1,2] + [3,4,5] you will get string = "1,23,4,5"
    //
    // if you want to have [1,2,3,4,5] array as result of adding arrays,
    // you have to use concatenation like this:[1,2].concat([3,4,5])
    //
    // In your case:
    // $scope.pages = groupThree.concat(groupOne.concat(groupTwo));
} else {
    $scope.message = 'No Options';
}

然后在视图中显示(如您所见,您为 $scope.pages 分配了一个数组,因此您可以使用 ng-repeat 对其进行迭代):

<h3>Pages</h3>
<div ng-repeat="page in pages">
  {{ page.name }}
</div>  

<div>{{ message }}</div>

附:看看我的代码中的 cmets,你可能在我评论的地方有错误。

【讨论】:

  • 真的很棒的工作!我遇到的唯一问题是三个组的 .concat() 对我不起作用(groupThree.concat(groupOne.concat(groupTwo)))
  • 我也试过 groupOne.concat(groupTwo,groupThree);这适用于 w3schools 但不适用于我的代码:/
【解决方案2】:

我尝试在上述上下文中应用ng-if,它似乎非常有用。您可以使用ng-if 显示和隐藏 DOM 元素,在这种情况下显示组数据。因此,如果选中第三个复选框,则显示第 2 组数组:

   <h4>Group2</h4>
   <div ng-repeat="g2 in groupTwo" ng-if="value3">
      {{g2.name}} 
   </div>

如果您有多个模型依赖于外观,那么您可以在 ng-if 表达式中应用布尔条件,如下所示:

   <h4>Group 1</h4>
   <div ng-repeat="g1 in groupOne" ng-if="value1 && value2">
      {{g1.name}} 
   </div>

我在较旧的答案中发现了上述内容:angular-ng-if-with-multiple-arguments

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<body ng-app="checkBoxExample">
  <script>
  angular.module('checkBoxExample', [])
    .controller('ActionController', ['$scope', function($scope) {

      $scope.groupOne = [{name:'BudgetCharts'},{name:'BudgetComparison'},{name:'EDITBudgetAmounts'}];
      
      $scope.groupTwo  = [{name:'Optimize'},{name:'ReviewAndAdjust'}];
      
      $scope.groupThree = [{ name: 'Export'},{ name: 'Import'},{ name: 'Construction Program'}, { name: 'ExportStrategies'}];     
    }]);
</script>
<form name="selectionForm" ng-controller="ActionController">
    <table class="table table-striped">
        <thead>
           ...nothing important in here
        </thead> 
        <tbody>
           <tr>
              <td>
                 <div class="checkbox">
                     <label>
                         <input type="checkbox" id="selectionCondition" ng-model="value1" ng-checked="value1"/>50 million
                         <button rel="popover" type="button" class="close hoverMessage" data-dismiss="modal" data-toggle="popover" data-content="And here's some amazing content. It's very engaging. right?">
                              <span class="fa fa-info-circle">Button 1</span>
                         </button>
                     </label>
                  </div>
                </td>
       
             </tr>
             <tr>
                <td>
                   <div class="checkbox">
                       <label>
                           <input type="checkbox" id="selectionDistribution" ng-model="value2" ng-checked="value2"/>100 million
                              <button rel="popover" type="button" class="close hoverMessage" data-dismiss="modal" data-toggle="popover" data-content="And here's some amazing content. It's very engaging. right?">
                                  <span class="fa fa-info-circle">Button 2</span>
                              </button>
                       </label>
                   </div>
                </td>
             </tr>
             <tr>
                <td>
                   <div class="checkbox">
                        <label>
                            <input type="checkbox" value="status" id="selectionProgram" ng-model="value3" ng-checked="value3"/>Status Quo
                            <button rel="popover" type="button" class="close hoverMessage" data-dismiss="modal" data-toggle="popover" data-content="And here's some amazing content. It's very engaging. right?">
                               <span class="fa fa-info-circle">Button 3</span>
                            </button>
                        </label>
                    </div>
                 </td>
              </tr>
              <tr>
                 <td>
                     <div class="checkbox">
                          <label>
                             <input type="checkbox" value="nothing" id="selectionTreatment" ng-model="value4" ng-checked="value4"/>Do Nothing
                             <button rel="popover" type="button" class="close hoverMessage" data-dismiss="modal" data-toggle="popover" data-content="And here's some amazing content. It's very engaging. right?">
                                 <span class="fa fa-info-circle">Button 4</span>
                             </button>
                        </label>
                     </div>
                 </td>
              </tr>
          </tbody>
       </table>
       <h4>Group 1</h4>
       <div ng-repeat="g1 in groupOne" ng-if="value1 && value2">
          {{g1.name}} 
       </div>
       
       <br>
       <h4>Group 2</h4>
       <div ng-repeat="g2 in groupTwo" ng-if="value3">
          {{g2.name}} 
       </div>
       
       <br>
       
       <h4>Group 3</h4>
       <div ng-repeat="g3 in groupThree" ng-if="value1 && value2 && value3">
          {{g3.name}} 
       </div>
       
        <br>

       <div ng-if="value4">
          <b>Do Nothing selected</b>
       </div>
    </form>
</body>

【讨论】:

  • 感谢您的回答,因为它帮助我理解了 ng-if,但在这种情况下我无法帮助我,因为这只是数百个页面名称和数十个组的一小部分.因此,为每个组设置一个单独的 div 会非常干燥。如果有一种方法只有一个 div 可以动态地将所有组保存在一起(取决于选中哪个复选框),那么也许这可以工作。
  • @Markus 感谢您提供的信息 :-) 我认为在控制器的功能中可以进行某种数组/对象操作。我正在考虑将选定的组放在一个数组中。然后在视图中打印具有代表选定复选框的组的相同数组。
【解决方案3】:

不太明白,但我认为您缺少“双向数据绑定”的专业知识!

如果模型发生变化(使用 ng-model 在 html 中输入),Twoway 数据绑定通过刷新控制器(js 代码)使您的 Angular 应用真正动态化。

在 codepen 上查看此示例:http://codepen.io/ngocminh1112/pen/EjPapL 看看钢笔下面的示例表单对象,角度如何通过与输入交互来更新 formData 变量。

所以,有一个名为 formData 的变量绑定到作用域:

$scope.formData = {};

所有的输入都会得到一个具有自定义属性的变量。

当您与输入交互时,Angular 会更新 scope.formData 对象。

【讨论】:

  • 似乎是我想采用的方法,但我一辈子都无法让它正常工作。我本质上是在使用复选框代码并在我的代码中使用它,但它不起作用
  • 我还更新了我的代码并添加了一个与您所拥有的非常相似但可以使用我的一些代码的代码笔。
猜你喜欢
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 2022-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
相关资源
最近更新 更多