【问题标题】:iterating over hierarchical data to create a flattened table view in AngularJS迭代分层数据以在 AngularJS 中创建一个扁平的表视图
【发布时间】:2014-12-24 09:59:22
【问题描述】:

我正在尝试使用 AngularJS 创建有效的表格标记,但不知道该怎么做。我看到过类似的问题,但没有一个专门满足我的需求。

我有一些比赛结果数据存储在如下结构中:

{
    "date": "1900-01-01",
    "venue": "Venue",
    "results": {
        "10k": {
            "freestyle": {
                "male": [
                    "...a bunch of individual racer results"
                ],
                "female": [
                    "...a bunch of individual racer results"
                ]
            },
            "classical": {
                "male": [
                    "...a bunch of individual racer results"
                ],
                "female": [
                    "...a bunch of individual racer results"
                ]
            }
        },
        "5k": {
            "freestyle": {
                "male": [
                    "...a bunch of individual racer results"
                ],
                "female": [
                    "...a bunch of individual racer results"
                ]
            },
            "classical": {
                "male": [
                    "...a bunch of individual racer results"
                ],
                "female": [
                    "...a bunch of individual racer results"
                ]
            }
        }
    }
}

所以它的结构是:距离、风格、性别、个人赛车手。

我可以将这些结果呈现到单独的表格中,如下所示:

<div ng-show="race.results" ng-cloak>
        <div ng-repeat="(dist, styles) in race.results">
                <div ng-repeat="(style, genders) in styles">
                        <div ng-repeat="(gender, finishers) in genders">
                                <table class="raceResultsTable">
                                        <tr>
                                                <th class="raceEvent" colspan="6">
                                                        <h3 class="tableHeading" id="{{ dist|createKey }}_{{ style|createKey }}_{{ gender|createKey }}_results">{{ dist }} {{ style }} {{ gender }}</h3> <a href="#result_index" class="backToTop" title="Back to results index">&#65514;</a>
                                                </th>
                                        </tr>
                                        <tr>
                                                <th><strong>Place</strong></th>
                                                <th><strong>Name</strong></th>
                                                <th><strong>Age</strong></th>
                                                <th><strong>Age Group</strong></th>
                                                <th><strong>Time</strong></th>
                                                <th><strong>Pace</strong></th>
                                        </tr>
                                        <tr ng-repeat="racer in finishers | orderObjectBy:'place'">
                                                <td>#{{ racer.place }}</td>
                                                <td>{{ racer.name }}</td>
                                                <td>{{ racer.age }}</td>
                                                <td>{{ racer.age_group }}</td>
                                                <td>{{ racer.time }}</td>
                                                <td>{{ racer.pace }}/k</td>
                                        </tr>
                                </table>
                                <p></p>
                        </div><!-- genders -->
                </div><!-- styles -->
        </div><!-- distances -->
</div><!-- show/hide -->

这会创建很多额外的标记来促进迭代,但它确实有效。我遇到的问题是我想在顶部有一个索引。最初它只是每个表中 H3 的 ID 的一行锚点。那工作得很好。但是,现在我想包含导出链接以及指向页面表的链接,并让所有内容对齐我想将其放入表中,但我不确定如何执行此操作。要将每一行放在同一个表中,需要在本质上是“虚拟”元素上使用多个 ng-repeat 迭代器,但我不知道我能做到这一点并在 &lt;table&gt; 内生成有效标记。

理想情况下,我可以做类似...

<tr ng-repeat="(dist, (style, (gender, finishers) in genders) in styles) in race.results">
  <td><a href="#{{dist}}_{{style}}_{{gender}}_results">{{dist}} {{style}} {{gender}}</a></tr>
  <td><a href="#" class="download">CSV</a></td>
</tr>

AngularJS 要求其所有逻辑都附加到 DOM 元素意味着它需要生成不必要的标记。我看到一个关于创建“指令”的参考,这对我来说看起来很陌生。我并不反对学习 AngularJS 的来龙去脉,但这让我觉得应该是直截了当的东西。在像 Twig 这样的模板系统中,这将是一件轻而易举的事,但我觉得我将不得不跳很多圈才能使用 AngularJS 完成此任务。

是否有一种不涉及控制器内部所有逻辑的简单方法?如果指令方法是唯一的选择,那就这样吧,但我认为这是对 AngularJS 和我追求它的兴趣的巨大标记。

【问题讨论】:

    标签: javascript angularjs iteration html-table


    【解决方案1】:

    您最大的问题是 ng-repeat 仅适用于数据数组。您希望它遍历数据对象,这是行不通的。您需要更改数据结构,或为每个层次结构对模板进行硬编码。

    【讨论】:

    • 嗯,它确实有效(在我的 Q 中的第二个代码清单中生成结果表的部分),并且 Angular 文档确实描述了用于迭代的“(键,值)数据”对象属性,所以这不是问题。尽管重组数据是我需要做的,但您很可能是对的。我真的希望 Angular 有足够的灵活性来处理我所拥有的东西,而不需要按摩/重组它,但我想它就是这样。
    • 我猜你是对的。我本可以发誓我读到的东西说这不起作用,所以我最终重新格式化了一堆东西以使其起作用。我已经为此启动了一个 Plunker,看看我是否可以让它工作。 plnkr.co/edit/jEr64nmDhDXJ74S5iMjU
    • 除了排序,我在上面的 plunker 中工作。
    猜你喜欢
    • 2019-03-15
    • 1970-01-01
    • 2011-03-24
    • 2022-11-16
    • 2019-01-05
    • 2021-10-03
    • 1970-01-01
    • 2015-03-26
    • 2018-08-18
    相关资源
    最近更新 更多