【问题标题】:Angular4: Component.name doesn't work on productionAngular4:Component.name 不适用于生产
【发布时间】:2018-03-15 15:01:39
【问题描述】:

所以我一直面临这个奇怪的问题,但我不确定这是一个错误还是我在这里遗漏了一些东西。
因此,我有一个名为 TestComponent 的组件,并且在 AppComponent 中有一个按钮,当我单击它时,我通过执行此操作 TestComponent.name 获得了 TestComponent 的名称。

AppComponent强>:

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 也运行良好,这就是我在控制台中得到的:



当我调用 ng build --prod 来压缩文件并减小它们的大小时,我得到了以下结果:

这正常吗?!

【问题讨论】:

  • 变量name的值是怎么赋值的?
  • @Aravind 不,它不是 TestComponent 类中的变量,它是 TypeScript 上的一个函数,可以像 Java class.getClassName() 那样将组件的名称作为字符串提供给您

标签: javascript angular ecmascript-6


【解决方案1】:

我发现最好的方法是使用在编译时重命名类的库,其工作方式类似于 C# nameof。 nameof&lt;MyInterface&gt;(); 结果:“我的界面”

https://github.com/dsherret/ts-nameof

【讨论】:

    【解决方案2】:

    我刚刚回答了一个相关问题here

    要解决修改类名的问题,您可以创建一个函数并检查它是否等于您要测试的类。在这种情况下,对于 TestComponent,您可以使用:

    getType(o: any): string {
          if (o === TestComponent)
              return 'TestComponent';
    }
    

    调用它会打印组件名称:

    console.log(getType(TestComponent)); // will print 'TestComponent'
    

    【讨论】:

    • 我觉得这是一种丑陋丑陋的做法......但是......这是迄今为止克服我面临的障碍的最简单方法。谢谢!
    【解决方案3】:

    Function name 包含实际的函数名称。如果函数被缩小为一个字母的名字,它就会失去原来的名字。在可以可能在某些时候缩小的应用程序(即每个客户端应用程序)中永远不应该依赖它。 Node.js 可能有例外。

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

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

    这是related question

    【讨论】:

      【解决方案4】:

      是的,这是正常的,因为 angular-cli/webpack 和其他工具正在通过缩小 JavaScript 代码来更改类名。因此,在生产构建中缩小后,您总是只会看到一个字母或类似的东西。

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

      【讨论】:

      • 那么解决方案是什么?当我在开发基于许多动态组件的应用程序时,我实际上遇到了这个问题,我需要在特定事件之后获取特定组件的名称!
      • 创建自己的标识符
      猜你喜欢
      • 1970-01-01
      • 2013-07-13
      • 2018-06-01
      • 2016-08-30
      • 2021-05-04
      • 2018-02-22
      • 2015-09-07
      • 1970-01-01
      • 2016-11-08
      相关资源
      最近更新 更多