javascript - 在对象数组上使用 Angular 的 group-by 表达式,每个对象都有一个嵌套数组

标签 javascript angularjs

我正在尝试使用 Angulars group-by 语法为表单数据创建下拉列表

[{name:'xyz', 子项:[{}...N]}...N](见下文)

http://plnkr.co/edit/Rthy3Bje7ISYVOSwzIZZ?p=preview

似乎 group-by 不支持这种结构,所以我只能在 optgroup 元素上使用 ng-repeat 。这使我不得不将所选项目视为字符串,然后必须将其解析回对象。

问题 1:Angular 的 group-by 语法可以在我的数据结构上工作以生成适当的 optgroups 吗?

如果没有,那么

问题 2:我当前使用 ng-repeater 而不是 optgroups 的实现是我必须用来解决此问题的基本风格还是我缺少更简单的解决方案?

<!DOCTYPE html>
<html>

  <head>
    <script data-require="angular.js@*" data-semver="1.3.0" src="//code.angularjs.org/1.3.0/angular.js"></script>
  </head>

  <body ng-controller="myCtrl">

    <h3>Can select-group-by expression be used here????</h3>
    <select ng-options="obj.name for obj in data" ng-model="selectedObj">
    </select>
    {{selectedObj}}

    <h3>In lieu of repeating optgroups?</h3>
    <select ng-model="selectedModel2" ng-change="convert()">
      <optgroup ng-repeat="obj in data" label="{{obj.name}}">
        <option value="{{bsnObj}}" 
                ng-repeat="bsnObj in obj.bsnObjs">{{bsnObj.name}}</option>
      </optgroup>
    </select>
    {{selectedModel2}}

    <script>
      var app=angular.module("app",[]);
      app.controller("myCtrl",function($scope){

        $scope.convert=function(){
          $scope.selectedModel2 = JSON.parse(this.selectedModel2);
        };

        $scope.data=[
          {"name" : "forms", bsnObjs: [{name:"formA"},{name:"formB"}]},
          {"name" : "docs", bsnObjs: [{name:"docsA"},{name:"docsB"}]}
        ]
      });
      angular.bootstrap(document,["app"]);
    </script>

  </body>

</html>

最佳答案

如果您有嵌套的对象数组(如下面的 json),请使用下面的代码来展平列表:

$scope.data=[
            {"name" : "forms", bsnObjs: [{name:"formA"},{name:"formB"}]},
            {"name" : "docs", bsnObjs: [{name:"docsA"},{name:"docsB"}]}
     ];
    var options = [];
    for(indexKey1 in $scope.data) {
        for(indexKey2 in $scope.data[indexKey1].bsnObjs) {
            ($scope.data[indexKey1].bsnObjs[indexKey2]).parent_name = $scope.data[indexKey1].name;
             options.push($scope.data[indexKey1].bsnObjs[indexKey2]);
        }
    }
    $scope.data = options;
    console.log($scope.data); // your flatten list

现在使用:

 <select ng-options="obj.name group by obj.parent_name for obj in data"></select>

关于javascript - 在对象数组上使用 Angular 的 group-by 表达式,每个对象都有一个嵌套数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26514133/

相关文章:

angularjs - 有什么方法可以在单个 Controller 中使用 $uibModal 和 $uibModalInstance 来使用 angular 和 typescript 实现模态弹出窗口?

javascript - 如何在 Javascript 中向数组添加其他对象

javascript - react Hook 错误 : Hooks can only be called inside the body of a function component

javascript - Angularjs:ng-repeat 元素的输入

javascript - 可能的 Angular 属性指令错误?

javascript - 如何使用 REST API 将表单数据从 ionic 应用程序发送到 parse.com MBaaS

javascript - Bootstrap 模态表单不在服务器上执行 POST 方法

javascript - Math.floor 返回 NaN

javascript - 从样式组中选择 css 样式

javascript - AngularJS 选择框 - ngClick 未触发