Javascript Angular 2路由已弃用:如何检测CanActivate?

Javascript Angular 2路由已弃用:如何检测CanActivate?,javascript,angular,Javascript,Angular,我有一个用@CanActivate装饰的组件 @Component({ // ... }) @CanActivate(() => false) export class UserManagementComponent { // ... } 在我的导航菜单中,我想禁用或隐藏导航到此路线的链接。我该怎么做呢 <a [routerLink]="['UserManagement']">User management</a> 用户管理 PS:我仍然使用不

我有一个用
@CanActivate
装饰的组件

@Component({
    // ...
})
@CanActivate(() => false)
export class UserManagementComponent {
    // ...
}
在我的导航菜单中,我想禁用或隐藏导航到此路线的链接。我该怎么做呢

<a [routerLink]="['UserManagement']">User management</a>
用户管理

PS:我仍然使用不推荐的路由机制,而不是rc1版本。

如果您将
@CanActivate(()=>…)
返回值的计算移动到服务,那么您可以从整个应用程序访问它。您可以创建一个指令并将其添加到注入服务的
routerLink
,当路由条件返回
false
时,该指令将禁用
routerLink

有关如何在
@CanActivate
中使用DI的信息,请参阅

@Component({
    // ...
})
@CanActivate(() => false)
export class UserManagementComponent {
    // ...
}

有关如何禁用路由链接的信息,请参见和。如果将
@CanActivate(()=>…)
返回值的计算移动到服务,则可以从整个应用程序访问它。您可以创建一个指令并将其添加到注入服务的
routerLink
,当路由条件返回
false
时,该指令将禁用
routerLink

有关如何在
@CanActivate
中使用DI的信息,请参阅

@Component({
    // ...
})
@CanActivate(() => false)
export class UserManagementComponent {
    // ...
}

有关如何禁用路由链接的信息,请参见和。我认为使用注入式服务是一个不错的选择,因为如果您需要从其他组件路由到您的组件,那么就更容易了,而且您不必复制反射代码

尽管如此,我还是对如何进行反思感到好奇。所以它看起来应该被添加到ES7规范中。目前,“反射元数据”包pollyfills用于此,Angular2也在内部使用此包。虽然“Reflect”已经是TypeScript库的一部分,但我没有发现任何元数据反射,似乎它只支持对象反射

//This is a bit hacky, but it might help.
...
export class Test {
    ...
    logType(target : any, key : string) {
        //stop TypeScript from mapping this to TypeScript Reflect.
        var Reflect = Reflect || {}; 

        //You still get an error if you havn't added the Reflect.js script in the page
        var t = Reflect.getMetadata("design:type", target, key);

        console.log('key:' + key + ' type: ' + t.name);
    }
    ...
}
资料来源:


我相信注入式服务是一种可行的方法,因为如果您需要从其他附加组件路由到您的组件,这将非常容易,而且您不必重复反射代码

尽管如此,我还是对如何进行反思感到好奇。所以它看起来应该被添加到ES7规范中。目前,“反射元数据”包pollyfills用于此,Angular2也在内部使用此包。虽然“Reflect”已经是TypeScript库的一部分,但我没有发现任何元数据反射,似乎它只支持对象反射

//This is a bit hacky, but it might help.
...
export class Test {
    ...
    logType(target : any, key : string) {
        //stop TypeScript from mapping this to TypeScript Reflect.
        var Reflect = Reflect || {}; 

        //You still get an error if you havn't added the Reflect.js script in the page
        var t = Reflect.getMetadata("design:type", target, key);

        console.log('key:' + key + ' type: ' + t.name);
    }
    ...
}
资料来源:


我猜返回值并不总是静态的
false
,这仅适用于本例?。通常它是根据一些条件计算出来的。事实上,为了保持示例的简单性,我猜返回值并不总是静态的
false
,这只是针对这个示例?。通常它是根据一些条件计算出来的。事实上,只是为了保持示例的简单性。