首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检索活动组件和路径

检索活动组件和路径
EN

Stack Overflow用户
提问于 2017-01-11 07:49:27
回答 5查看 14K关注 0票数 6

使用Angular2,我如何检索当前激活的组件和路径?

例如,我可能有以下路由:

代码语言:javascript
运行
复制
{ path: '', component: HomeComponent },
{ path: 'list', component: ListComponent },
{ path: ':id/', component: CustomComponent }

如果我已经导航到https://domain.com/test,有没有办法知道我当前正在查看CustomComponent并检索id/路径,在本例中是“测试”?

我可以使用带正则表达式的window.location.pathname来获取路径,但是这很混乱,而且仍然不允许我轻松地获取活动组件。

EN

Stack Overflow用户

发布于 2018-08-14 12:16:35

ActivatedRouteSnapshot中,component属性被定义为以下属性之一

代码语言:javascript
运行
复制
component: Type<any> | string | null;

因此,除非您已经确保拥有Type<any>,否则不能只执行component.name。这是因为字符串上的.name不存在。

现在,Type<any>实际上是一个创建类型(组件类型)的函数,其定义如下:

代码语言:javascript
运行
复制
export interface Type<T> extends Function {
    new (...args: any[]): T;
}

所以你可以做一些类似这样的事情,它将实际编译

代码语言:javascript
运行
复制
 if (typeof(this.route.snapshot.component) === 'function')
 {
     // the compiler is 'smart' enough to know that component here must be Type<T>
     const name = this.route.snapshot.component.name;
 }

一种“优雅”的方式是使用typescript typeguard (尽管坦率地说,在这种情况下它并没有给你带来比我刚才所说的更多的好处)。

代码语言:javascript
运行
复制
isComponent(item: Type<any> | string | null): item is Type<any>
{
    return typeof item === 'function';
}

然后你可以说this.name = isComponent(this.route.snapshot.component) ? this.route.snapshot.component : null

要点: component.name构建中仍然有效,但不幸的是,在使用r时,它将最终成为随机的东西。

我不得不注入private element: ElementRef<HTMLElement>,然后查找标记名。这将仍然存在,即使使用AOT prod build。这样做可能会有性能成本,所以如果您经常使用它,请对其进行缓存。

代码语言:javascript
运行
复制
    if (element.nativeElement.tagName.startsWith('RR-')){
        super.name = element.nativeElement.tagName;
    }
票数 3
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41580495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档