@angular:如何构建指令以根据所选路由添加属性?
@angular : how to build a directive to add an attribute based on selected route?
以下代码工作正常(属性 data-toggle-state)正确设置为 active 和 无效。
<a [routerLink]="['/home']" [attr.data-toggle-state]="router.isActive('/home', true) ? 'active' : 'inactive'">Home</a>
<a [routerLink]="['/admin']" [attr.data-toggle-state]="router.isActive('/admin', true) ? 'active' : 'inactive'">Home</a>
但是,我想创建一个具有相同功能的新指令。
我的 typescript 指令代码如下所示:
Directive({
selector: '[xDataToggleState]'
})
export class ToggleStateDirective {
@Input('xDataToggleState')
public route: string;
constructor(private router: Router, private activeRoute: ActivatedRoute, private el: ElementRef, private render: Renderer) {
this.toggle(this.route);
}
private toggle(route: string) {
if (this.route) {
this.render.setElementAttribute(this.el.nativeElement, 'data-toggle-state', this.router.isActive(this.route, false) ? 'active' : 'inactive');
}
}
}
html 看起来像:
<a routerLink]="['/home']" xDataToggleState="/home">Home</a>
但是,this.route总是未定义的?所以指令不起作用。
在@yurzui 的帮助下,我能够完成这项工作。但是我使用了 ngDoCheck().
查看以下指令的工作代码:
import { Directive, ElementRef, Input, Renderer, HostListener, OnInit, OnChanges, SimpleChanges, DoCheck } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
@Directive({
selector: '[xDataToggleState]'
})
export class ToggleStateDirective implements OnInit, DoCheck {
@Input('xDataToggleState')
public route: string;
constructor(private router: Router, private el: ElementRef, private render: Renderer) {
}
public ngOnInit(): void {
}
public ngDoCheck(): void {
this.toggle(this.route);
}
private toggle(route: string) {
console.debug('route=' + this.route);
if (this.route) {
console.debug('this.router.isActive(this.route, false)=' + this.router.isActive(this.route, false));
this.render.setElementAttribute(this.el.nativeElement, 'data-toggle-state', this.router.isActive(this.route, false) ? 'active' : 'inactive');
}
}
}
当我单击菜单项时,所有项目都会更新,如单击 admin link.[=12= 时从控制台日志中可以看到的那样]
route=/home
this.router.isActive(this.route, false)=false
route=/admin
this.router.isActive(this.route, false)=true
route=/data
this.router.isActive(this.route, false)=false
以下代码工作正常(属性 data-toggle-state)正确设置为 active 和 无效。
<a [routerLink]="['/home']" [attr.data-toggle-state]="router.isActive('/home', true) ? 'active' : 'inactive'">Home</a>
<a [routerLink]="['/admin']" [attr.data-toggle-state]="router.isActive('/admin', true) ? 'active' : 'inactive'">Home</a>
但是,我想创建一个具有相同功能的新指令。
我的 typescript 指令代码如下所示:
Directive({
selector: '[xDataToggleState]'
})
export class ToggleStateDirective {
@Input('xDataToggleState')
public route: string;
constructor(private router: Router, private activeRoute: ActivatedRoute, private el: ElementRef, private render: Renderer) {
this.toggle(this.route);
}
private toggle(route: string) {
if (this.route) {
this.render.setElementAttribute(this.el.nativeElement, 'data-toggle-state', this.router.isActive(this.route, false) ? 'active' : 'inactive');
}
}
}
html 看起来像:
<a routerLink]="['/home']" xDataToggleState="/home">Home</a>
但是,this.route总是未定义的?所以指令不起作用。
在@yurzui 的帮助下,我能够完成这项工作。但是我使用了 ngDoCheck().
查看以下指令的工作代码:
import { Directive, ElementRef, Input, Renderer, HostListener, OnInit, OnChanges, SimpleChanges, DoCheck } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
@Directive({
selector: '[xDataToggleState]'
})
export class ToggleStateDirective implements OnInit, DoCheck {
@Input('xDataToggleState')
public route: string;
constructor(private router: Router, private el: ElementRef, private render: Renderer) {
}
public ngOnInit(): void {
}
public ngDoCheck(): void {
this.toggle(this.route);
}
private toggle(route: string) {
console.debug('route=' + this.route);
if (this.route) {
console.debug('this.router.isActive(this.route, false)=' + this.router.isActive(this.route, false));
this.render.setElementAttribute(this.el.nativeElement, 'data-toggle-state', this.router.isActive(this.route, false) ? 'active' : 'inactive');
}
}
}
当我单击菜单项时,所有项目都会更新,如单击 admin link.[=12= 时从控制台日志中可以看到的那样]
route=/home
this.router.isActive(this.route, false)=false
route=/admin
this.router.isActive(this.route, false)=true
route=/data
this.router.isActive(this.route, false)=false