【问题标题】:Complex nested rows table using ngRepeat使用 ngRepeat 的复杂嵌套行表
【发布时间】:2016-04-08 04:06:27
【问题描述】:

我有一个看起来像这样的对象:

{
    "10": {},
    "12": {
        "20": {
            "value": 1,
            "id": 1,
        },
        "100": {
            "value": 12,
            "id": 1,
        }
    },
    "14": {
        "100": {
            "value": 14,
            "id": 2,
        }
    },
    "16": {},
    "18": {},
    "20": {
        "100": {
            "value": 23,
            "id": 1,
        },
        "150": {
            "value": 56,
            "id": 3,
        }
    },
    "22": {},
    "24": {},
    "26": {
        "50": {
...

我想根据这个对象创建一个表,应该是这样的:

我不确定如何通过使用正确的重复组合来创建此表。我目前正在尝试:

<table>
    <thead>
        <tr>
            <th>type</th>
            <th>module</th>
            <th>value</th>
            <th>id</th>
        </tr>
    </thead>
    <tbody>

        <tr ng-repeat-start="(row1, value1) in TestData">
            <td rowspan="{{value1.length}}">{{row1}}</td>
            <td ng-repeat="(label2, value2) in value1">{{label2}}</td>
        </tr>
    </tbody>
</table>

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    乍一看,你可以通过插入 &lt;tbody&gt; 来做类似的事情(更多信息在这里:Angular.js ng-repeat across multiple tr's

    var myAppModule = angular.module('myApp', []).controller('MyController', MyController);
    
    function MyController() {
    
      // https://stackoverflow.com/questions/1345939/how-do-i-count-a-javascript-objects-attributes
      this.objectCount = function(obj) {
        return Object.keys(obj).length;
      }
    
      this.data = {
        "10": {},
        "12": {
          "20": {
            "value": 1,
            "id": 1,
          },
          "100": {
            "value": 12,
            "id": 1,
          },
          "200": {
            "value": 120,
            "id": 10,
          }
        },
        "14": {
          "100": {
            "value": 14,
            "id": 2,
          }
        },
        "16": {},
        "18": {},
        "20": {
          "100": {
            "value": 23,
            "id": 1,
          },
          "150": {
            "value": 56,
            "id": 3,
          }
        },
        "22": {},
        "24": {}
      };
    
    }
    table,
    th,
    td {
      border: 1px solid black;
    }
    table {
      border-collapse: collapse;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.8/angular.min.js"></script>
    
    <div ng-app="myApp" ng-controller="MyController as ctrl">
      <table>
        <thead>
          <tr>
            <th>type</th>
            <th>module</th>
            <th>value</th>
            <th>id</th>
          </tr>
        </thead>
        <tbody ng-repeat="(row1, value1) in ctrl.data" ng-switch="ctrl.objectCount(value1) === 0">
          <tr ng-switch-when="true">
            <td>{{row1}}</td>
            <td colspan="3"></td>
          </tr>
          <tr ng-switch-when="false" ng-repeat="(row2, value2) in value1">
            <td ng-if="$index === 0" rowspan="{{ctrl.objectCount(value1)}}">
              {{row1}}
            </td>
            <td>{{row2}}</td>
            <td>{{value2.value}}</td>
            <td>{{value2.id}}</td>
          </tr>
        </tbody>
      </table>
    </div>

    如果您需要通过合并行和列来进行更精细的操作,您应该考虑构建一个更具导向性的视图对象,以便模板更简单,并且您的业务逻辑在 JavaScript 中。

    【讨论】:

    • 嗨西里尔,感谢您的意见。实际上,我需要表格大致与我发布的表格一样,并带有嵌套的行。我可以在合理的范围内随心所欲地更改数据,但我仍然无法实现我想要的。
    • 那么,这只是 12 和 20 重复的问题吗?
    • 不完全是,这就是我使用 ngRepeat 的原因。每个原始对象,例如对象 12,最多可以有 6 种模式,在我得到它之前我无法知道。
    • 我已经更新了代码,12现在有3种模式,打印效果很好
    猜你喜欢
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    相关资源
    最近更新 更多