如何使用Angular Material动态创建基于JSON的菜单栏?

时间:2016-08-10 13:06:26

标签: angularjs json angular-material

我正在尝试使用Angular Material Menu Bar directive递归创建菜单栏,但结果不符合预期。到目前为止,我所拥有的最佳解决方案是创建一个指令并递归调用它,如下所示:https://plnkr.co/edit/5pFmmD6K3qz5qolRifVA。请注意,此Plunker中有两个菜单栏。第一个是使用JSON的递归结构创建的,第二个是直接写在模板上。我的解决方案的问题发生在有嵌套菜单,如" Lorem - > Dolor - > ...",因为嵌套菜单没有正确对齐。

检查Chrome上生成的代码,我注意到第二个菜单栏中的嵌套菜单(直接写在模板上)有一些关于其嵌套状态的属性:

<md-menu md-position-mode="cascade" 
    class="md-nested-menu md-menu ng-scope"
    md-nest-level="1">
...
</md-menu>

虽然第一个菜单栏中的相同菜单没有:

<md-menu ng-if="ctrl.isCompoundedMenuItem()" class="md-menu ng-scope">
...
</md-menu>

我该怎么做才能解决这个问题?

添加信息:我已经尝试了一种方法using ng-include来创建菜单栏,但结果非常糟糕。

2 个答案:

答案 0 :(得分:4)

我能够通过设置问题中提到的属性和类来解决菜单行为的问题&#34;手动&#34;在指令模板中,如下所示:

<md-menu ng-if="ctrl.isCompoundedMenuItem()"
         md-position-mode="cascade"
         class="md-nested-menu"
         md-nest-level="{{ ::nestLevel }}">

nestLevel位于隔离范围内,并在每个新级别递增:

<md-menu-content class="md-menu-bar-menu md-dense">
   <my-menu-item ng-repeat="item in menu.items" menu="item"
                 nest-level="{{ ::(nestLevel + 1) }}"></my-menu-item>
</md-menu-content>

从1开始,自然:

<md-menu-bar ...>
   ...
   <md-menu-content>
      <my-menu-item ng-repeat="item in menu.items" menu="item" 
                    nest-level="1"></my-menu-item>
   </md-menu-content>
</md-menu-bar>

可以在此处看到更新的plunker:https://plnkr.co/edit/QBjeR2hZFKsJ88Hl4ptG

答案 1 :(得分:0)

有时我们想在元素的右侧指定对齐方式,例如,如果我们在工具栏的右侧有一个菜单,我们希望右对齐菜单内容。

我们可以在x轴和y轴上使用md-position-mode属性指定原点。现在只有x轴有多个选项。您可以指定目标目标或目标右目标的默认模式,以指定面向右侧的对齐目标。有关更多示例,请参阅演示的位置部分。

  <md-menu ng-if="ctrl.isCompoundedMenuItem()" md-position-mode="target-right target">

OR

有时候不可避免地需要对菜单的定位进行更深层次的控制以确保完美对齐。 md-menu提供md-offset属性,以允许调整精确定位的像素级别特定。

此偏移量以x y或n的格式提供,其中n将在x轴和y轴上使用。

例如,要将菜单从顶部移动2px,我们可以使用:

       <md-menu ng-if="ctrl.isCompoundedMenuItem()" md-offset="120 0">

mdMenu API Documentation