【问题标题】:AngularJS - Building a dynamic table based on a jsonAngularJS - 基于 json 构建动态表
【发布时间】:2013-08-21 12:25:23
【问题描述】:

给定这样的 json:

{
   "name": "john"
   "colours": [{"id": 1, "name": "green"},{"id": 2, "name": "blue"}]
}

和两个常规的 html 输入:

<input type="text" name="name" />
<input type="text" name="color" />
<input type="submit" value="submit" />

我需要建立一个包含所有可能变化的表格,例如:

John green
John blue

这意味着如果用户继续通过输入添加值,新行将出现构建新变体,例如:

我还需要有可用的 id 来处理它,当我使用输入添加新值时,我需要它:“Peter”“Black”,我需要像动态一样自动填充 id(颜色 id)在 mysql 中自动递增,结果如下:

{
  "colours": […...{"id": 3, "name": "black"}]
}

这可能吗?我有哪些选择可以用 Angular 做到这一点?我还在用 jQuery 的方式思考,我想用 Angular 的方式来做。

我查看了 hg-repeat,并使用了它,但我不知道如何提供预期的结果,我唯一想到的是使用嵌套的 ng-repeat,但它没有没用。

非常感谢,

吉列尔莫

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    只是想与我迄今为止使用的东西分享以节省您的时间。

    这里是硬编码标题动态标题的例子(如果不关心数据结构的话)。在这两种情况下,我都写了一些简单的指令:customSort

    自定义排序

    .directive("customSort", function() {
        return {
            restrict: 'A',
            transclude: true,    
            scope: {
              order: '=',
              sort: '='
            },
            template : 
              ' <a ng-click="sort_by(order)" style="color: #555555;">'+
              '    <span ng-transclude></span>'+
              '    <i ng-class="selectedCls(order)"></i>'+
              '</a>',
            link: function(scope) {
    
            // change sorting order
            scope.sort_by = function(newSortingOrder) {       
                var sort = scope.sort;
    
                if (sort.sortingOrder == newSortingOrder){
                    sort.reverse = !sort.reverse;
                }                    
    
                sort.sortingOrder = newSortingOrder;        
            };
    
    
            scope.selectedCls = function(column) {
                if(column == scope.sort.sortingOrder){
                    return ('icon-chevron-' + ((scope.sort.reverse) ? 'down' : 'up'));
                }
                else{            
                    return'icon-sort' 
                } 
            };      
          }// end link
        }
        });
    

    [第一个带有静态标题的选项]

    我用的是单ng-repeat

    这是 Fiddle 中的一个很好的例子(注意,没有 jQuery 库!

               <tbody>
                    <tr ng-repeat="item in pagedItems[currentPage] | orderBy:sortingOrder:reverse">
                        <td>{{item.id}}</td>
                        <td>{{item.name}}</td>
                        <td>{{item.description}}</td>
                        <td>{{item.field3}}</td>
                        <td>{{item.field4}}</td>
                        <td>{{item.field5}}</td>
                    </tr>
                </tbody>
    

    [带有动态标题的第二个选项]

    演示 2:Fiddle


    HTML

    <table class="table table-striped table-condensed table-hover">
                <thead>
                    <tr>
                       <th ng-repeat="header in table_headers"  
                         class="{{header.name}}" custom-sort order="header.name" sort="sort"
                        >{{ header.name }}
    
                            </th> 
                      </tr>
                </thead>
                <tfoot>
                    <td colspan="6">
                        <div class="pagination pull-right">
                            <ul>
                                <li ng-class="{disabled: currentPage == 0}">
                                    <a href ng-click="prevPage()">« Prev</a>
                                </li>
    
                                <li ng-repeat="n in range(pagedItems.length, currentPage, currentPage + gap) "
                                    ng-class="{active: n == currentPage}"
                                ng-click="setPage()">
                                    <a href ng-bind="n + 1">1</a>
                                </li>
    
                                <li ng-class="{disabled: (currentPage) == pagedItems.length - 1}">
                                    <a href ng-click="nextPage()">Next »</a>
                                </li>
                            </ul>
                        </div>
                    </td>
                </tfoot>
                <pre>pagedItems.length: {{pagedItems.length|json}}</pre>
                <pre>currentPage: {{currentPage|json}}</pre>
                <pre>currentPage: {{sort|json}}</pre>
                <tbody>
    
                    <tr ng-repeat="item in pagedItems[currentPage] | orderBy:sort.sortingOrder:sort.reverse">
                         <td ng-repeat="val in item" ng-bind-html-unsafe="item[table_headers[$index].name]"></td>
                    </tr>
                </tbody>
            </table>
    

    附注:

    ng-bind-html-unsafe 已弃用,因此我仅将其用于演示(第二个示例)。欢迎您编辑。

    【讨论】:

    • 非常感谢您的回答马克西姆!对此,我真的非常感激!最好的问候,吉列尔莫
    • 您能否在 2 日提供一个带有动态标题的完整实时示例? :)
    • @devH 感谢您的评论。我用这两个工作示例极大地改变了我的答案。
    • 这里也一样,非常感谢您的回答非常有用
    【解决方案2】:

    这是一个使用 angularJS 的动态列和行的示例:http://plnkr.co/edit/0fsRUp?p=preview

    【讨论】:

      【解决方案3】:

      TGrid 是人​​们通常不会在 google 搜索中找到的另一个选项。如果您发现的其他网格不适合您的需求,您可以尝试一下,它是免费的

      【讨论】:

      • 谢谢!我终于自己建立了一些东西。再次感谢:)
      【解决方案4】:

      查看这个angular-table 指令。

      【讨论】:

        【解决方案5】:
        <table class="table table-striped table-condensed table-hover">
            <thead>
            <tr>
                <th ng-repeat="header in headers | filter:headerFilter | orderBy:headerOrder" width="{{header.width}}">{{header.label}}</th>
            </tr>
            </thead>
            <tbody>
            <tr ng-repeat="user in users" ng-class-odd="'trOdd'" ng-class-even="'trEven'" ng-dblclick="rowDoubleClicked(user)">
                <td ng-repeat="(key,val) in user | orderBy:userOrder(key)">{{val}}</td>
            </tr>
            </tbody>
            <tfoot>
        
            </tfoot>
        </table>
        

        参考这个https://gist.github.com/ebellinger/4399082

        【讨论】:

          【解决方案6】:

          首先我要感谢@MaximShoustin。

          谢谢你,我的桌子真的很好。

          我在$scope.range$scope.setPage 中提供了一些小的修改。

          通过这种方式,我现在可以转到最后一页或返回第一页。 此外,当我要进入下一页或上一页时,导航会在 $scope.gap 横穿时发生变化。并且当前页面并不总是在第一位置。对我来说它看起来更好。

          这是新的小提琴示例: http://jsfiddle.net/qLBRZ/3/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-03-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多