在 Angular 中使用 ng-repeat 进行递归 [英] Recursion with ng-repeat in Angular

查看:22
本文介绍了在 Angular 中使用 ng-repeat 进行递归的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在基于付费网站主题的 Angular 应用程序中,我的侧边菜单中的项目具有以下数据结构.数据结构是我自己的,菜单是从原始菜单视图派生出来的,ul 中的所有项目都经过硬编码.

SidebarController.js 中:

$scope.menuItems = [{isNavItem":真,"href": "#/dashboard.html",文本":仪表板"},{isNavItem":真,"href": "javascript:;","text": "AngularJS 特性",子项目":[{"href": "#/ui_bootstrap.html","text": " UI 引导程序"},...]},{isNavItem":真,"href": "javascript:;","text": "jQuery 插件",子项目":[{"href": "#/form-tools","text": "表单工具"},{isNavItem":真,"href": "javascript:;","text": "数据表",子项目":[{"href": "#/datatables/managed.html","text": "托管数据表"},...]}]}];

然后我将以下部分视图绑定到该模型,如下所示:

<ul class="page-sidebar-menu" data-keep-expanded="false" data-auto-scroll="true" data-slide-speed="200" ng-class="{'page-sidebar-menu-closed': settings.layout.pageSidebarClosed}"><li ng-repeat="item in menuItems" ng-class="{'start': item.isStart, 'nav-item': item.isNavItem}"><a href="{{item.href}}" ng-class="{'nav-link nav-toggle': item.subItems && item.subItems.length > 0}"><span class="title">{{item.text}}</span></a><ul ng-if="item.subItems && item.subItems.length > 0" class="sub-menu"><li ng-repeat="item.subItems中的item" ng-class="{'start': item.isStart, 'nav-item': item.isNavItem}"><a href="{{item.href}}" ng-class="{'nav-link nav-toggle': item.subItems && item.subItems.length > 0}"><span class="title">{{item.text}}</span></a>

注意 视图绑定中可能有 $scope 属性,您在模型中看不到,反之亦然,但那是因为我已经编辑了它们简洁.现在因为第二层 li 也不包含它自己的 subItems 的条件 ulDatatable 下的子项 菜单项不会被渲染.

我怎样才能创建一个视图或模板,或两者都递归地绑定到模型,以便呈现所有子项的所有子项?这通常最多只有四个级别.

解决方案

你可以简单地使用 ng-include 来创建一个部分并递归调用它:部分应该是这样的:

    <li ng-repeat="item.subItems 中的项目"><a href="{{item.href}}" ng-class="{'nav-link nav-toggle': item.subItems && item.subItems.length > 0}"><span class="title">{{item.text}}</span></a><div ng-switch on="item.subItems.length > 0"><div ng-switch-when="true"><div ng-init="subItems = item.subItems;"ng-include="'partialSubItems.html'"></div>

还有你的 html:

<ul class="page-sidebar-menu" data-keep-expanded="false" data-auto-scroll="true" data-slide-speed="200" ng-class="{'page-sidebar-menu-closed': settings.layout.pageSidebarClosed}"><li ng-repeat="item in menuItems" ng-class="{'start': item.isStart, 'nav-item': item.isNavItem}"><a href="{{item.href}}" ng-class="{'nav-link nav-toggle': item.subItems && item.subItems.length > 0}"><span class="title">{{item.text}}</span></a><ul ng-if="item.subItems && item.subItems.length > 0" class="sub-menu"><li ng-repeat="item.subItems中的item" ng-class="{'start': item.isStart, 'nav-item': item.isNavItem}"><a href="{{item.href}}" ng-class="{'nav-link nav-toggle': item.subItems && item.subItems.length > 0}"><span class="title">{{item.text}}</span></a><div ng-switch on="item.subItems.length > 0"><div ng-switch-when="true"><div ng-init="subItems = item.subItems;"ng-include="'newpartial.html'"></div>

这是工作的plunkerhttp://plnkr.co/edit/9HJZzV4cgacK92xxQOr0?p=preview

I have the following data structure for items in my sidemenu, in an Angular app based on a paid-for web site theme. The data structure is my own, and the menu is derived from the original menu view with all items in the ul hard coded.

In SidebarController.js:

$scope.menuItems = [
    {
        "isNavItem": true,
        "href": "#/dashboard.html",
        "text": "Dashboard"
    },
    {
        "isNavItem": true,
        "href": "javascript:;",
        "text": "AngularJS Features",
        "subItems": [
            {
                "href": "#/ui_bootstrap.html",
                "text": " UI Bootstrap"
            },
            ...
        ]
    },
    {
        "isNavItem": true,
        "href": "javascript:;",
        "text": "jQuery Plugins",
        "subItems": [
            {
                "href": "#/form-tools",
                "text": " Form Tools"
            },
            {
                "isNavItem": true,
                "href": "javascript:;",
                "text": " Datatables",
                "subItems": [
                    {
                        "href": "#/datatables/managed.html",
                        "text": " Managed Datatables"
                    },
                    ...
                ]
            }
        ]
    }
];

Then I have the following partial view bound to that model as follows:

<ul class="page-sidebar-menu" data-keep-expanded="false" data-auto-scroll="true" data-slide-speed="200" ng-class="{'page-sidebar-menu-closed': settings.layout.pageSidebarClosed}">
    <li ng-repeat="item in menuItems" ng-class="{'start': item.isStart, 'nav-item': item.isNavItem}">
        <a href="{{item.href}}" ng-class="{'nav-link nav-toggle': item.subItems && item.subItems.length > 0}">
            <span class="title">{{item.text}}</span>
        </a>
        <ul ng-if="item.subItems && item.subItems.length > 0" class="sub-menu">
            <li ng-repeat="item in item.subItems" ng-class="{'start': item.isStart, 'nav-item': item.isNavItem}">
                <a href="{{item.href}}" ng-class="{'nav-link nav-toggle': item.subItems && item.subItems.length > 0}">
                    <span class="title">{{item.text}}</span>
                </a>
            </li>
        </ul>
    </li>
</ul>

NOTE There may be $scope properties in the view bindings you don't see in the model, or vice versa, but that is because I have edited them for brevity. Now because the second level li doesn't also contain a conditional ul for its own subItems, the sub-items under the Datatable menu item don't get rendered.

How can I create a view or template, or both, that will bind recursively to the model, so that all sub-items of all sub-items are rendered? This will normally only be up to four levels.

解决方案

You can simply use ng-include to make a partial and call it recursively: Partial should be something like this:

<ul>
    <li ng-repeat="item in item.subItems">
      <a href="{{item.href}}" ng-class="{'nav-link nav-toggle': item.subItems && item.subItems.length > 0}">
          <span class="title">{{item.text}}</span>
      </a>
      <div ng-switch on="item.subItems.length > 0">
        <div ng-switch-when="true">
          <div ng-init="subItems = item.subItems;" ng-include="'partialSubItems.html'"></div>  
        </div>
      </div>
    </li>
</ul>

And your html:

<ul class="page-sidebar-menu" data-keep-expanded="false" data-auto-scroll="true" data-slide-speed="200" ng-class="{'page-sidebar-menu-closed': settings.layout.pageSidebarClosed}">
    <li ng-repeat="item in menuItems" ng-class="{'start': item.isStart, 'nav-item': item.isNavItem}">
        <a href="{{item.href}}" ng-class="{'nav-link nav-toggle': item.subItems && item.subItems.length > 0}">
            <span class="title">{{item.text}}</span>
        </a>
        <ul ng-if="item.subItems && item.subItems.length > 0" class="sub-menu">

            <li ng-repeat="item in item.subItems" ng-class="{'start': item.isStart, 'nav-item': item.isNavItem}">
                 <a href="{{item.href}}" ng-class="{'nav-link nav-toggle': item.subItems && item.subItems.length > 0}">
                    <span class="title">{{item.text}}</span>
                </a>

                 <div ng-switch on="item.subItems.length > 0">
                    <div ng-switch-when="true">
                      <div ng-init="subItems = item.subItems;" ng-include="'newpartial.html'"></div>  
                    </div>
                </div>

            </li>
        </ul>
    </li>
</ul>

Here is the working plunker http://plnkr.co/edit/9HJZzV4cgacK92xxQOr0?p=preview

这篇关于在 Angular 中使用 ng-repeat 进行递归的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
前端开发最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆