【发布时间】:2016-06-13 09:15:24
【问题描述】:
在基于付费网站主题的 Angular 应用程序中,我的侧边菜单中的项目具有以下数据结构。数据结构是我自己的,菜单来源于原始菜单视图,所有项目都在ul硬编码。
在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"
},
...
]
}
]
}
];
然后我将以下部分视图绑定到该模型,如下所示:
<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>
注意在模型中看不到的视图绑定中可能有$scope 属性,反之亦然,但那是因为为了简洁起见,我对它们进行了编辑。
现在因为第二级li 不包含条件ul 用于它自己的subItems,所以Datatable 菜单项下的子项不会被呈现。
如何创建将递归绑定到模型的视图或模板,或两者兼而有之,以便呈现所有子项的所有子项?这通常最多只有四个级别。
【问题讨论】:
-
item in item.subitems这真的很难调试,在第二个 ng-repeatitem是第一个和第二个重复的项目,当我复制你的时,将它重命名为 subItem 或除此 Edit 之外的任何内容将代码放入 plunker 即可立即运行:plnkr.co/edit/P8zJWJO9jXtKu2Yt97TR?p=preview -
@maurycy 我只是暂时为迭代变量保留了相同的名称,因为当我最终遇到递归绑定场景时,模板将只使用一个变量,只有一个名称,
item。我没有做任何调试,模板按原样工作,除了二级子项。 -
你检查了我的 plunk 链接吗?问题一定出在其他地方,您可以尝试在 plunk 或任何其他类似工具上重现它吗?
-
@maurycy 不,我花了 1 秒钟才发现你的 plunk 不起作用。在
Datatables菜单项下,有一个名为Managed Datatables的子项。这不会显示在您的 plunker 中,我也不希望它显示。我的观点不是为递归而编码的,这就是这个问题的重点:我在问如何递归地编码它。
标签: javascript angularjs recursion angularjs-ng-repeat