【问题标题】:Why isn't my directive rendering any bound elements?为什么我的指令没有渲染任何绑定元素?
【发布时间】:2016-07-09 10:38:50
【问题描述】:

这来自我的问题Recursion with ng-repeat in Angular,但绝不是重复的。现在我知道该怎么做,但我想问为什么我目前的解决方案不起作用。

我正忙于调整巨大的 Metronic Angular 主题,我的第一个任务是从 REST api 动态加载侧边菜单项。侧面菜单的容器,在主 index.html 页面(仅使用的页面:doing spa)中如下所示:

<div data-ng-include="'tpl/sidebar.html'" data-ng-controller="SidebarController" class="page-sidebar-wrapper"></div>

然后sidebar.html 看起来像这样:

<div class="page-sidebar navbar-collapse collapse">
    <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}"
        rsng-menuItem="menuItems">
    </ul>
</div>

您会注意到我的自定义指令rsng-menuItem,用于递归菜单树:

angular.module("ReflexPortalApp").directive("rsngMenuItem", ["$parse", function ($parse) {
    return {
        restrict: "A",
        scope: true,
        templateUrl: "/tpl/sidebar/menu-item.html",
        link: function (scope, element, attrs) {
            scope.List = $parse(attrs.rsngMenuItem)(scope);
        }
    }
}]);

它的模板如下所示:

<li ng-repeat="item in List" ng-class="{\'nav-item\': !item.IsHeading, \'start\': item.IsStart}">
    <a href="{{item.Href}}" ng-class="{\'nav-link nav-toggle\': item.subItems && item.subItems.length > 0}">
        <i ng-if="{{item.Icon && item.Icon.length > 0}}" class="icon-{{item.Icon}}"></i>
        <span class="title">{{item.Text}}</span>
        <span ng-if="{{item.DecorClass || item.DecorText}}" class="{{item.DecorClass}}">{{item.DecorText}}</span>
    </a>
    <ul rsng-menuItem="item.subItems" class="sub-menu"></ul>
</li>

SideBarController1, the menu items do load successfully from the REST API, and are assigned to themenuItems` 范围属性中,因此它们应该可用于绑定。

最后,一个菜单项在 JSON 中如下所示:

{
  "IsDisabled": "0",
  "seq": 2,
  "Href": "javascript:;",
  "Id": "2",
  "IsStart": "0",
  "IsNavItem": "1",
  "DecorText": null,
  "ApiCall": null,
  "Index": 3,
  "Text": "Accounting",
  "Icon": "settings",
  "ParentId": null,
  "DecorClass": "arrow",
  "subItems": [
    {
      "DecorClass": "arrow",
      "ParentId": "2",
      "Icon": "wrench",
      "Text": "Statement",
      "Index": 1,
      "ApiCall": "statement&CustID=4446&statementdate=2016-05-01",
      "DecorText": null,
      "IsNavItem": "0",
      "IsStart": "0",
      "Id": "3",
      "Href": "list",
      "seq": 1,
      "IsDisabled": "0"
    }
  ]
}

当我开始,并且不知道如何在模板中进行递归时,我只是使用递归代码循环和 jQuery 来“手动”构造和填充每个菜单项的所有元素,效果很好,但是用代码文字编写 HTML 很臭。

现在我只是得到一个空白的侧边菜单,控制台中没有错误(一定喜欢 Angular 的那个部分),并且想知道我是否做任何明显错误的事情。

【问题讨论】:

  • 当您在指令命名与属性中出现拼写错误时,Angular 绝不会抛出错误。它不知道你犯了错误。检查指令是否正在自己初始化

标签: javascript jquery html angularjs angularjs-directive


【解决方案1】:

问题在于您的指令名称,Angular 根本无法识别您的指令,因为它不能很好地处理属性名称中的大写字母。将rsng-menuItem 重命名为rsng-menu-item

但是,这是行不通的,因为您不能只在 Angular 中递归嵌套指令,它会以无限循环结束。

对此有多种解决方案,请查看Recursion in Angular directiveshttps://github.com/marklagendijk/angular-recursion

【讨论】:

  • 呵呵,你指的问题也是我的,我正在尝试实现其中一个答案。
  • 嗯,它来自 Benny Bottema。但是,命名也必须固定。
猜你喜欢
  • 2017-05-14
  • 1970-01-01
  • 2018-04-19
  • 2016-02-01
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
相关资源
最近更新 更多