【问题标题】:Push and splice into array when checkall and checkbox is checked in angularjs在angularjs中选中checkall和checkbox时推送并拼接到数组中
【发布时间】:2019-04-08 17:18:56
【问题描述】:

我正在尝试基于 checkall 推送和拼接元素,单击单个复选框,我的问题是我从 angularjs 发布请求中获取列表并使用 ng-repeat 显示它我已经提供了在新的文本中输入一些文本的规定列以及ng-repeat 数据。现在基于用户选择的 checkall 或单击的单个复选框,我将数据推送到数组中。在这里,当用户单击单个复选框时,我可以推送数据,但是当用户单击 chekall 复选框 0、1 时,推送的是数组而不是文本框值。任何帮助将不胜感激。

HTML

<table class='reportstd' align='center' width='80%'>
  <tr class='trdesign'>
    <td>
      <input type="checkbox" name="checkAll" id="all" data-ng-model="checkedAll" data-ng-change="toggleCheckAll()" />
    </td>
    <td> Sl No</td>
    <td> RO No.</td>
    <td> Truck No.</td>
  </tr>


  <tr data-ng-repeat="user in  RosList">
    <td> <input type="checkbox" value="{{user.do_ro_no}}" data-ng-model="user.checked" data-ng-change="modifyArrayToPost(user,truck_no[$index])" /> </td>
    <td>{{$index + 1}}</td>
    <td>{{user.do_ro_no}}</td>
    <td><input type='text' data-ng-model="truck_no[$index]" id="truck_no_{{$index}}" name="truck_no_{{$index}}" value=""></td>
  </tr>
</table>

<table>
  <tr>
    <td colspan='2'><input type="submit" id="btn_submit" name='sea' value='Search' data-ng-submit="postROs(arrayToPost)" /></td>

  </tr>
</table>

Angularjs

$scope.arrayToPost = [];
$scope.toggleCheckAll = function() {
  if ($scope.checkedAll) {
    angular.forEach($scope.RosList, function(user, truckno) {
      user.checked = true;
      $scope.modifyArrayToPost(user, truckno);
    });
  } else {
    angular.forEach($scope.RosList, function(user, truckno) {
      user.checked = false;
      $scope.modifyArrayToPost(user, truckno);
    });
  }
}

$scope.modifyArrayToPost = function(user, truckno) {

  if (user.checked && truckno != null && $scope.arrayToPost.indexOf(user.do_ro_no) == -1) {
    $scope.arrayToPost.push(user.do_ro_no, truckno);
  } else if (!user.checked) {
    $scope.arrayToPost.splice($scope.arrayToPost.indexOf(user.do_ro_no, truckno), 2);
  }
}
$scope.$watch('RosList', function() {
  var allSet = true;
  var allClear = true;
  angular.forEach($scope.RosList, function(user, truckno) {
    if (user.checked) {
      allClear = false;
    } else {
      allSet = false;
    }
  });

  var checkAll = $element.find('#all');
  checkAll.prop('indeterminate', false);
  if (allSet) {
    $scope.checkedAll = true;
  } else if (allClear) {
    $scope.checkedAll = false;
  } else {
    $scope.checkedAll = false;
    checkAll.prop('indeterminate', true);
  }
}, true);
$scope.RosList = [
  {do_ro_no: "217PALV000201898", slno: 1, },
  {do_ro_no: "317PALV000201898", slno: 2, }
]

truck_no 模型不是来自 RosList。

【问题讨论】:

  • 你能把$scope.RosList的值加起来吗?
  • 0:"{do_ro_no: "217PALV000201898", slno: 1, } 1:"{do_ro_no: "317PALV000201898", slno: 2, }
  • 亲爱的@Fraction,data-ng-model="truck_no[$index]" 不是来自 $scope.RosList。
  • 检查我的答案

标签: angularjs checkbox angularjs-ng-repeat


【解决方案1】:

您应该在控制器中将truck_no 初始化为$scope.truck_no = [] 以便访问这些值,并在您的$scope.toggleCheckAll 函数中将$scope.modifyArrayToPost(user, truckno); 更改为$scope.modifyArrayToPost(user, $scope.truck_no[truckno]);

编辑: 我稍微修改了您的代码以处理所有情况。

演示:https://next.plnkr.co/edit/DnzsCFkPQU8ByFZ8

【讨论】:

  • 亲爱的@Fraction,当我取消选中复选框时它不起作用。
  • @BharathPateru 我已经更新了演示,现在它可以处理所有情况
  • 亲爱的@Fraction,$scope.arrayToPost = [ ...arrToPost ];这是做什么的,当我删除这行不起作用时,当我的代码中有这行时,它显示语法错误。
  • 这是ES6 Spread syntax,只有Internet explorer不支持,我用它把arrToPost的内容复制到$scope.arrayToPost,你可以替换成$scope.arrayToPost = arrToPost ;
  • 是的,我理解并将其用作 $scope.arrayToPost = arrToPost,当我打印数组时,我会像这个数组一样:["217PALV000201898","23424","317PALV000202012","3454456" ] 但我想像这样存储它们:[["217PALV000201898","23424"],["317PALV000202012","3454456"]],以区分行。
【解决方案2】:

如果我正确理解了这个问题,我认为解决方案要简单得多。主要的困惑是不仅有一个“真相来源”——你为每一行保存一个状态,所有do_ro_no's

我建议只跟踪每一行,并在需要时计算arrayToPost

像这样:

angular.module('app', []).controller('ctrl', ($scope, $element) => {
  $scope.truck_no = [];
  $scope.RosList = [{
      do_ro_no: "217PALV000201898",
      slno: 1,
    },
    {
      do_ro_no: "317PALV000201898",
      slno: 2,
    }
  ];
  
  $scope.getTruckNo = () => {
    return $scope.truck_no.filter((t, index) => {
      return $scope.RosList[index].checked;
    });
  }
  
  $scope.getArrayToPost = () => {
    return $scope.RosList
      .filter(ros => ros.checked)
      .map(ros => ros.do_ro_no);
  }
  $scope.arrayToPost = [];
  $scope.toggleCheckAll = function() {
    if ($scope.checkedAll) {
      //angular.forEach($scope.RosList, function(user, truckno) {
      //  user.checked = true;
      //  $scope.modifyArrayToPost(user, truckno);
      //});
      $scope.RosList.forEach(ros => ros.checked = true);
    } else {
      //angular.forEach($scope.RosList, function(user, truckno) {
      //  user.checked = false;
      //  $scope.modifyArrayToPost(user, truckno);
      //});
      
      $scope.RosList.forEach(ros => ros.checked = false);
    }
  }

  //$scope.modifyArrayToPost = function(user, truckno) {
  //  if (user.checked && truckno != null && $scope.arrayToPost.indexOf(user.do_ro_no) == -1) {
  //    $scope.arrayToPost.push(user.do_ro_no, truckno);
  //  } else if (!user.checked) {
  //    $scope.arrayToPost.splice($scope.arrayToPost.indexOf(user.do_ro_no, truckno), 2);
  //  }
  //}

  //$scope.$watch('RosList', function() {
  //  var allSet = true;
  //  var allClear = true;
  //  angular.forEach($scope.RosList, function(user, truckno) {
  //    if (user.checked) {
  //      allClear = false;
  //    } else {
  //      allSet = false;
  //    }
  //  });
//
  //  var checkAll = $element.find('#all');
  //  checkAll.prop('indeterminate', false);
  //  if (allSet) {
  //    $scope.checkedAll = true;
  //  } else if (allClear) {
  //    $scope.checkedAll = false;
  //  } else {
  //    $scope.checkedAll = false;
  //    checkAll.prop('indeterminate', true);
  //  }
  //}, true);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>

<div ng-app="app" ng-controller="ctrl">
  <table class='reportstd' align='center' width='80%'>
    <tr class='trdesign'>
      <td>
        <input type="checkbox" name="checkAll" id="all" data-ng-model="checkedAll" data-ng-change="toggleCheckAll()" />
      </td>
      <td> Sl No</td>
      <td> RO No.</td>
      <td> Truck No.</td>
    </tr>


    <tr data-ng-repeat="user in  RosList">
      <td> <input type="checkbox" value="{{user.do_ro_no}}" data-ng-model="user.checked" data-ng-change="modifyArrayToPost(user,truck_no[$index])" /> </td>
      <td>{{$index + 1}}</td>
      <td>{{user.do_ro_no}}</td>
      <td><input type='text' data-ng-model="truck_no[$index]" id="truck_no_{{$index}}" name="truck_no_{{$index}}" value=""></td>
    </tr>
  </table>

  <table>
    <tr>
      <td colspan='2'><input type="submit" id="btn_submit" name='sea' value='Search' data-ng-submit="postROs(arrayToPost)" /></td>

    </tr>
  </table>

  <pre>
    {{getTruckNo() | json}}
  </pre>
</div>

数组是getTruckNo() 的结果,正如您在 sn-p 中看到的那样。

【讨论】:

  • 亲爱的@Mosh Feu 我想将文本框值存储到数组中,当未选中复选框时,我想从数组中删除选中的行详细信息(do_ro_no,文本框)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-29
  • 1970-01-01
  • 2019-04-17
  • 2016-12-23
  • 2016-06-25
相关资源
最近更新 更多