2017-10-04 130 views
1

所以我一直在面对这个奇怪的问题,但我不确定它是一个bug还是我在这里丢失了一些东西。
所以我有一个名为TestComponent的组件,并且在AppComponent中,当我点击它时,我有一个按钮,通过执行TestComponent.name来获得TestComponent的名称。

AppComponent
Angular4:Component.name在生产上不起作用

import { TestComponent } from './test/test.component'; 
import { Component } from '@angular/core'; 

@Component({ 
    selector: 'app-root', 
    template: '<button (click)="showName()">Show</button>' 
}) 
export class AppComponent {  
    showName(){ 
    console.log('component name: "' + TestComponent.name + '"'); 
    } 
} 

你可以通过点击按钮,看到我想要得到的TestComponent的名字基本上“TestComponent”
的问题是,这种行之有效的发展模式,如果我叫ng build太正常工作,这就是我在控制台中看到:

enter image description here

当我打电话ng build --prod,来压缩文件并减小它们的大小,我得到这个结果:

enter image description here

这是正常的吗?!

+0

如何赋值给变量'name'? – Aravind

+0

@Aravind不,它不是TestComponent类中的变量,它是TypeScript上的一个函数,它可以将组件的名称像Java中的类class.getClassName()' – SlimenTN

回答

1

Functionname包含实际的功能名称。如果该功能被缩小为单字母名称,则会丢失其原始名称。在某些情况下,即在每个客户端应用程序中,可以将可能缩小的应用程序永远不应该依赖它。 Node.js可能有例外。

name在某些浏览器中是只读的,因此不能被覆盖。如果一个班级需要标识符,则应明确指定不同的名称:

class Foo { 
    static id = 'Foo'; 
    ... 
} 

这里是一个related question

2

是的,这是正常的,因为angular-cli/webpack和其他工具正通过缩小JavaScript代码来改变类名。所以在缩小生产版本之后,你总是只能看到一个字母或类似的东西。

请勿在您的逻辑中使用此名称,因为它会在生产中中断。

+0

那样给出,那么解决方案是什么?实际上,当我在研究基于许多动态组件的应用程序时,我遇到了这个问题,我需要在特定事件之后获取特定组件的名称! – SlimenTN

+0

创建您自己的标识符 – Moema