【问题标题】:AngularJS nested ul list and ng-repeatAngularJS 嵌套 ul 列表和 ng-repeat
【发布时间】:2014-12-02 14:42:12
【问题描述】:

首先我不得不说我是 AngularJS 的新手,但我必须修改一个 web 应用程序,即将列表嵌套在另一个应用程序中:

<ul class="first-level">
  <li ng-repeat="item in list">{{item.parentNo1}}
     <ul class="level-2">
       <li ng-repat="item in list">{{item.childOfCurrentParent}}</li>
       . . .
     </ul>
  </li>

  <li ng-repeat="item in list">{{item.parentNo2}}
     <ul class="level-2">
       <li ng-repat="item in list">{{item.childOfCurrentParent}}</li>
       . . .
     </ul>
  </li>
</ul>

我收到了一个这样的对象数组 (JSON):

[{
    "id": 53,
    "nazwa": "Plafon Nekko",
    "foto": "01/01 _ Koma Nekko.jpg",
    "visible": 0,
    "cat_id": 1,
    "strona": 1,
    "styl": "nowoczesny",
    "rodzina": "Nekko",
    "kod": "O2177",
    "bookmark": true,
    "title": "nowoczesny Nekko",
    "page": 1,
    "image": "/lemir/www//gazetka/01/01 _ Koma Nekko.jpg",
    "width": 849,
    "height": 1201,
    "tags": "nowoczesny Koma O2180 Plafon Koma nowoczesny Koma O2181 Plafon Koma nowoczesny Koma O2182 Plafon Koma nowoczesny Koma O2183 Plafon Koma nowoczesny Koma O2184 Plafon Koma nowoczesny Koma O2185 Plafon Koma nowoczesny Koma O2186 Plafon Koma nowoczesny Koma O2187 Plafon Koma nowoczesny Nekko O2170 Plafon Nekko nowoczesny Nekko O2171 Plafon Nekko nowoczesny Nekko O2172 Plafon Nekko nowoczesny Nekko O2173 Plafon Nekko nowoczesny Nekko O2174 Plafon Nekko nowoczesny Nekko O2175 Plafon Nekko nowoczesny Nekko O2176 Plafon Nekko nowoczesny Nekko O2177 Plafon Nekko"
},...]

我需要将父级放在第一级,将其子级放在第二级,当循环找到另一个父级时,它应该创建另一个一级li 等等。

我需要将样式属性(父)与名称属性(子)相关联 当 ng-repeat 找到另一个父值时,如何强制它返回一级?

【问题讨论】:

  • 您提供的 JSON 没有显示任何子父关系的迹象。
  • 好的,那么您建议我应该将什么属性添加到 JSON 中?我需要将样式属性(父)与名称属性(子)相关联

标签: javascript angularjs json loops nested-lists


【解决方案1】:

我知道这个问题有点老了,但我认为这是管理嵌套列表的一个很好的解决方案,而且我认为它更“干净”。

这里是一位博主的链接,他在 Angular 中发布了关于递归模板的内容。当您不知道层次列表的深度时,此方法非常有用:

angularjs-recursive-templates

分层列表:

[ 
{ 
    title: 'Computers',
    categories: [
      {
        title: 'Laptops',
        categories: [
          {
            title: 'Ultrabooks'
          },
          {
            title: 'Macbooks'            
          }
        ]
      },
      {
        title: 'Desktops'
      },
      {
        title: 'Tablets',
        categories: [
          { 
            title: 'Apple'
          },
          {
            title: 'Android'
          }
        ]        
      }
    ]
  },
  {
    title: 'Printers'
  }
]

他的角度样本:

<!-- recursive template -->
<script type="text/ng-template" id="categoryTree">
    {{ category.title }}
    <ul ng-if="category.categories">
        <li ng-repeat="category in category.categories" ng-include="'categoryTree'">           
        </li>
    </ul>
</script>
<!-- use -->
<ul>
     <li ng-repeat="category in categories" ng-include="'categoryTree'"></li>
</ul>

你可以在JSFiddle看到决赛

我希望这可能对某些人有所帮助。

咳咳!

【讨论】:

    【解决方案2】:

    我的建议是在模型中处理这种情况,而不是在前端进行。

    您可以创建 2 个自定义函数,根据需要返回模型。

    那么你可以这样称呼他们:

    <ul ng-repeat="parent in getParents(items)">
        ...
        <ul ng-repeat="child in getChildren(items, parent)">
            ...
    

    或者,如果您可以控制 Json 格式,更简单的解决方案是更改它以满足您的需求。您可以将其更改为父母数组。然后让每个父母都包含一个孩子数组。

    然后事情会变得简单很多;类似:

    <ul ng-repeat="parentItem in items">
        ...
        <ul ng-repeat="childItem in parentItem.children">
            ...
    

    【讨论】:

    • 你能给我一些关于这些自定义函数的简单例子吗?
    • 你有过Json结构吗?如果是,您可以将其更改为直接满足您的需要。
    • 是的,我有,我应该如何更改它?上面我从 JSON 文件中放了一个对象。其余对象中的所有属性都相同。 “Styl”是父母,“rodzina”是孩子。
    • 只需将其更改为父母数组即可。然后让每个父母都包含一个孩子数组。
    • 谢谢您确认我需要像您说的那样更改 json 文件,并使用具有上述示例中的功能的 ng-repeat 指令?
    【解决方案3】:

    你也可以这样做。您可以将子数组添加到您的 json 中并循环遍历它。

    var app = angular.module('myApp', []);
    app.controller('myCtrl', function($scope) {
      $scope.list = [{
        "id": 53,
        "nazwa": "Plafon Nekko",
        "foto": "01/01 _ Koma Nekko.jpg",
        "visible": 0,
        "cat_id": 1,
        "strona": 1,
        "styl": "nowoczesny",
        "rodzina": "Nekko",
        "kod": "O2177",
        "children": [{
          "name": "xyz",
          "age": "15"
        }, {
          "name": "pqr",
          "age": "10"
        }],
        "tags": "nowoczesny Koma O2180"
      }];
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <div ng-app="myApp" ng-controller="myCtrl">
      <ul>
        <li ng-repeat="parent in list">{{parent.nazwa}}
          <ul>
            <li ng-repeat="child in parent.children">{{child.name }}</li>
          </ul>
        </li>
      </ul>
    </div>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-04
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 2018-12-23
      相关资源
      最近更新 更多