javascript - AngularJS - 递归指令不起作用(无限循环)

标签 javascript angularjs angularjs-directive ecmascript-6

我需要创建一个能够处理多个(不是确切数量)级别的子菜单的菜单

MainMenu.js(包含带有所有菜单项的菜单属性)

class MainMenu {

    // @ngInject
    constructor() {


        this.menu = {
            name: 'Main menu',
            list: [
               {
                name: 'Sub menu lvl 1',
                list: [
                    {
                     name: 'Sub menu lvl 2',
                     list: [
                        {
                         name: 'Sub menu lvl 3'
                        } 
                     ]
                    }
                ]
               } 
            ]
        }



    }
}

export default function () {
    return {
        scope: {},
        templateUrl: 'path/to/MainMenu.tpl.html',
        replace: true,
        controller: MainMenu,
        controllerAs: 'mainMenuCtrl'
    };
};
<小时/>

这是模板 html 文件 (MainMenu.tpl.html)

<div>
    <nav id="menu" class="cm-menuwrapper">
        <ul class="cm-menu">
            <li ng-repeat="menuItem in mainMenuCtrl.menu.list">
                <a class="cursor-pointer" ng-click="mainMenuCtrl.someMethod(menuItem)"><span>{{menuItem.name}}</span></a>
                <sub-menu menu-item="menuItem" ng-if="menuItem.list"></sub-menu>
            </li>
        </ul>
    </nav>
</div>

子菜单.js

class SubMenu {

    // @ngInject
    constructor() {

    }


}

export default function () {
    return {
        scope: {},
        templateUrl: 'path/to/SubMenu.tpl.html',
        replace: true,
        controller: SubMenu,
        controllerAs: 'subMenuCtrl',
        bindToController: {
            menuItem : "="
        }
    };
};
<小时/>

子菜单html模板文件(SubMenu.tpl.html)

<ul class="cm-submenu">
    <li ng-repeat="submenu in subMenuCtrl.menuItem.list" ng-class="submenu.itemClass">
        <a class="cursor-pointer" ng-click="subMenuCtrl.someMethod(submenu)"><span>{{submenu.name}}</span></a>
        <sub-menu menu-item="submenu" ng-if="submenu.list"></sub-menu>
    </li>
</ul>

如您所见,我已放置 <sub-menu ....> directivve 到 SubMenu.tpl.html 中,这似乎导致某种无限循环。 浏览器卡在空白页面并且消耗内存和CPU。

对此问题有什么建议吗?

最佳答案

您必须在 Angular 的初始编译中隐藏子指令。在链接函数中动态添加递归子菜单。这里是修改后的SubMenu.js:

/* @ngInject */ 
function submenuDirective($compile) {
  return {
    scope: {},
    templateUrl: 'path/to/SubMenu.tpl.html',
    replace: true,
    controller: SubMenu,
    controllerAs: 'subMenuCtrl',
    bindToController: {
        menuItem : "="
    },
    link: function(scope, elm) {
       const submenuNode = elm.find('.cm-submenu-list');
       submenuNode.append('<sub-menu menu-item="submenu" ng-if="submenu.list"></sub-menu>');
       $compile(submenuNode)(scope);
    }
  };
};

并且不要忘记将包装器添加到模板中:

<ul class="cm-submenu">
  <li ng-repeat="submenu in subMenuCtrl.menuItem.list" ng-class="submenu.itemClass">
    <a class="cursor-pointer" ng-click="subMenuCtrl.someMethod(submenu)"><span>{{submenu.name}}</span></a>
    <!-- submenu items will be rendered here later -->
    <div class="cm-submenu-list"></div>
  </li>
</ul>

关于javascript - AngularJS - 递归指令不起作用(无限循环),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33695023/

相关文章:

php - 如何使用 PHP 保存和维护 javascript 文件的本地副本(考虑到并行性)?

javascript - 外部 JavaScript 文件中的 AJAX 调用未到达 Controller 中的 ActionResult

javascript - 使用纯 angularjs 的 Accordion ,无需 css

AngularJs ui-scroll 重新加载不起作用

angularjs - 在 angularjs 指令范围内公开对象,无法访问属性

javascript - 如何用 Angular 对元素进行计数?

javascript - 将 offsetTop 与 AngularJS ng-repeat 结合使用

asp.net - 如何在 Angular 路由中附加 URL?

javascript - Bootstrap 和 AngularJS : form-control-lg changes only input size, 不是标签

angularjs - 无法在 angularjs 中的页面之间传递数据 - 包括 plunker