How to use ng-repeat without an html element

后端 未结 8 1496
暖寄归人
暖寄归人 2020-11-30 23:35

I need to use ng-repeat (in AngularJS) to list all of the elements in an array.

The complication is that each element of the array will transform to ei

相关标签:
8条回答
  • 2020-12-01 00:15

    for a solution that really works

    html

    <remove  ng-repeat-start="itemGroup in Groups" ></remove>
       html stuff in here including inner repeating loops if you want
    <remove  ng-repeat-end></remove>
    

    add an angular.js directive

    //remove directive
    (function(){
        var remove = function(){
    
            return {    
                restrict: "E",
                replace: true,
                link: function(scope, element, attrs, controller){
                    element.replaceWith('<!--removed element-->');
                }
            };
    
        };
        var module = angular.module("app" );
        module.directive('remove', [remove]);
    }());
    

    for a brief explanation,

    ng-repeat binds itself to the <remove> element and loops as it should, and because we have used ng-repeat-start / ng-repeat-end it loops a block of html not just an element.

    then the custom remove directive places the <remove> start and finish elements with <!--removed element-->

    0 讨论(0)
  • 2020-12-01 00:17

    As of AngularJS 1.2 there's a directive called ng-repeat-start that does exactly what you ask for. See my answer in this question for a description of how to use it.

    0 讨论(0)
  • 2020-12-01 00:20

    You might want to flatten the data within your controller:

    function MyCtrl ($scope) {
      $scope.myData = [[1,2,3], [4,5,6], [7,8,9]];
      $scope.flattened = function () {
        var flat = [];
        $scope.myData.forEach(function (item) {
          flat.concat(item);
        }
        return flat;
      }
    }
    

    And then in the HTML:

    <table>
      <tbody>
        <tr ng-repeat="item in flattened()"><td>{{item}}</td></tr>
      </tbody>
    </table>
    
    0 讨论(0)
  • 2020-12-01 00:26

    The above is correct but for a more general answer it is not enough. I needed to nest ng-repeat, but stay on the same html level, meaning write the elements in the same parent. The tags array contain tag(s) that also have a tags array. It is actually a tree.

    [{ name:'name1', tags: [
      { name: 'name1_1', tags: []},
      { name: 'name1_2', tags: []}
      ]},
     { name:'name2', tags: [
      { name: 'name2_1', tags: []},
      { name: 'name2_2', tags: []}
      ]}
    ]
    

    So here is what I eventually did.

    <div ng-repeat-start="tag1 in tags" ng-if="false"></div>
        {{tag1}},
      <div ng-repeat-start="tag2 in tag1.tags" ng-if="false"></div>
        {{tag2}},
      <div ng-repeat-end ng-if="false"></div>
    <div ng-repeat-end ng-if="false"></div>
    

    Note the ng-if="false" that hides the start and end divs.

    It should print

    name1,name1_1,name1_2,name2,name2_1,name2_2,

    0 讨论(0)
  • 2020-12-01 00:28

    If you use ng > 1.2, here is an example of using ng-repeat-start/end without generating unnecessary tags:

    <html>
      <head>
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
        <script>
          angular.module('mApp', []);
        </script>
      </head>
      <body ng-app="mApp">
        <table border="1" width="100%">
          <tr ng-if="0" ng-repeat-start="elem in [{k: 'A', v: ['a1','a2']}, {k: 'B', v: ['b1']}, {k: 'C', v: ['c1','c2','c3']}]"></tr>
    
          <tr>
            <td rowspan="{{elem.v.length}}">{{elem.k}}</td>
            <td>{{elem.v[0]}}</td>
          </tr>
          <tr ng-repeat="v in elem.v" ng-if="!$first">
            <td>{{v}}</td>
          </tr>
    
          <tr ng-if="0" ng-repeat-end></tr>
        </table>
      </body>
    </html>

    The important point: for tags used for ng-repeat-start and ng-repeat-end set ng-if="0", to let not be inserted in the page. In this way the inner content will be handled exactly as it is in knockoutjs (using commands in <!--...-->), and there will be no garbage.

    0 讨论(0)
  • 2020-12-01 00:34
    <table>
      <tbody>
        <tr><td>{{data[0].foo}}</td></tr>
        <tr ng-repeat="d in data[1]"><td>{{d.bar}}</td></tr>
        <tr ng-repeat="d in data[2]"><td>{{d.lol}}</td></tr>
      </tbody>
    </table>
    

    I think that this is valid :)

    0 讨论(0)
提交回复
热议问题