Angular 2 routing-deprecated:如何检测CanActivate?

时间:2016-05-14 17:43:42

标签: javascript angular

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

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

在我的导航菜单中,我想禁用或隐藏导航到此路线的链接。我该怎么做呢?

<a [routerLink]="['UserManagement']">User management</a>

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

2 个答案:

答案 0 :(得分:2)

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

有关如何在@CanActivate中使用DI,请参阅http://almerosteyn.com/2016/04/linkup-custom-control-to-ngcontrol-ngmodel

有关如何停用routerLink

,请参阅Angular 2, disable routerLinkAngular2, what is the correct way to disable an anchor element?

答案 1 :(得分:0)

我认为注入服务是一种方法,因为如果您需要从其他附加组件路由到您的组件,它将更容易,您不必复制反射代码。

话虽如此,我很好奇如何做反思。所以它似乎应该被添加到ES7规范中。就目前而言,'reflection-metadata'包对它进行了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);
    }
    ...
}

来源:

http://blog.wolksoftware.com/decorators-metadata-reflection-in-typescript-from-novice-to-expert-part-4

https://www.npmjs.com/package/reflect-metadata