bixi
Version:
企业级中后台前端解决方案
122 lines (113 loc) • 2.93 kB
text/typescript
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
EventEmitter,
Input,
Optional,
Output,
ViewEncapsulation
} from '@angular/core';
import { Router } from '@angular/router';
import { BixiLayoutService } from '../layout.service';
import { IMenu } from '../layout.type';
export class BixiMenuComponent {
set menus(menus: IMenu[]) {
this._menus = menus;
this.resume();
this.openCurrentMenu();
}
get menus() {
return this._menus;
}
menuClick = new EventEmitter<IMenu>();
singleOpen = false;
_menus: IMenu[] = [];
open: boolean = true;
paddingLeft: number = 22;
constructor(
private router: Router,
private cdr: ChangeDetectorRef,
private layoutService: BixiLayoutService
) {
this.layoutService.openChange.subscribe((open: boolean) => {
this.open = open;
if (this.cdr) {
this.cdr.markForCheck();
}
});
}
onMenuClick(menuItem: IMenu) {
this.menuClick.emit({ ...menuItem, selected: true });
}
openCurrentMenu() {
const menus = this.menus.slice();
const dealData = (dealMenus: IMenu[]): boolean | void => {
for (const menu of dealMenus) {
if (menu.link && this.router.isActive(menu.link, !!menu.matchRouterExact)) {
return true;
}
if (menu.children && menu.children.length > 0) {
if (dealData(menu.children)) {
menu.open = true;
return true;
}
}
}
};
dealData(menus);
this._menus = menus;
}
onOpenChange(open: boolean, curMenu: IMenu) {
const menus = this.menus.slice();
const dealData = (dealMenus: IMenu[]): boolean | void => {
for (const menu of dealMenus) {
if (menu._id === curMenu._id) {
dealMenus.filter((item) => item._id !== curMenu._id).forEach(
(m) => {
m.open = false;
}
);
return true;
}
if (menu.children && menu.children.length > 0) {
if (dealData(menu.children)) {
return true;
}
}
}
};
if (open && this.singleOpen) {
dealData(menus);
this._menus = menus;
}
}
onToggleClick() {
this.layoutService.toggleMenu();
}
resume() {
let i = 1;
const setId = (menus: IMenu[]) => {
for (const item of menus) {
item._id = i++;
if (item.children && item.children.length > 0) {
setId(item.children);
}
}
};
setId(this._menus);
}
}