如何将md-menu项目转换为Material md-menu

时间:2017-07-04 22:16:27

标签: angular typescript angular-material2

如何将菜单项包含到子组件中 见例子:
dropdown.component.html

<div class="dropdown">
    <button md-icon-button
            [mdMenuTriggerFor]="dropMenu">
        <i class="glyphicon glyph-more"></i>
    </button>
</div>
<md-menu #navMenu="dropMenu" [overlapTrigger]="false">
    <ng-content></ng-content> 
    <!-- after rendering I'm able to see all buttons, 
         and interact with them my mouse click.
         But they not accessible with keyboard -->
</md-menu>

header.component.html

<div class="header">
  ...
  <dropdown>
    <button md-menu-item>Button 1</button>
    <button md-menu-item>Button 2</button>
    <button md-menu-item>Button 3</button>
  </dropdown>
  ...
</div>

它有效但不如预期。
我可以看到项目和菜单通过点击工作,但我无法使用键盘进行项目访问。 同样在 dropdown.component.ts 中,如果我通过MdMenu访问@ViewChild('navMenu')组件,则会显示0个项目
this.mdMenu.items // 0

1 个答案:

答案 0 :(得分:1)

MdMenu指令使用@ContentChildren获取MdMenuItem的列表。

@ContentChildren(MdMenuItem) items: QueryList<MdMenuItem>;

ngAfterContentInit() {
  this._keyManager = new FocusKeyManager(this.items).withWrap();
  this._tabSubscription = this._keyManager.tabOut.subscribe(() => this._emitCloseEvent());
}

由于ContentChildren仅适用于模板的组件所有者,因此菜单指令始终包含0项。

解决方法如下

<强> dropdown.component.ts

...
export class DropDownComponent {
  @ViewChild(MdMenu) menu: MdMenu;

  @ContentChildren(MdMenuItem) items: QueryList<MdMenuItem>;

  ngAfterViewInit() {
    this.menu.items = this.items;
    this.menu.ngAfterContentInit();
  }
}

<强> Plunker Example

另见