面试题答案
一键面试- 指令结构:
- 装饰器:使用
@Directive
装饰器来定义指令,指定选择器,例如selector: '[appDynamicMenu]'
。 - 输入属性:可能需要输入当前路由配置相关的数据,比如路由配置数组。
- 模板:在指令的模板中生成导航菜单的HTML结构,通常是
ul
和li
标签组成的列表。
- 装饰器:使用
- 与路由交互的关键代码:
- 引入路由服务:在指令的构造函数中注入
Router
服务,例如constructor(private router: Router) {}
。 - 点击事件处理:在模板的菜单项
li
标签上绑定点击事件,如<li *ngFor="let route of routes" (click)="navigateTo(route)">{{route.title}}</li>
。然后在指令类中定义navigateTo
方法:
navigateTo(route: any) { this.router.navigate([route.path]); }
- 引入路由服务:在指令的构造函数中注入
- 实现思路:
- 获取路由配置:可以从外部传入路由配置数据,也可以从
RouterModule
相关的配置中获取。 - 生成菜单:利用
*ngFor
指令遍历路由配置数据,生成对应的菜单项。 - 绑定点击事件:为每个菜单项绑定点击事件,在事件处理函数中使用
Router
服务的navigate
方法导航到对应的路由路径。 - 动态更新:可以通过订阅
Router.events
来监听路由变化,从而动态更新菜单状态,比如添加当前激活菜单项的样式。例如:
constructor(private router: Router) { this.router.events.subscribe((event) => { if (event instanceof NavigationEnd) { // 根据当前路由更新菜单样式等操作 } }); }
- 获取路由配置:可以从外部传入路由配置数据,也可以从