从Angular 2组件中访问`selector`

时间:2016-05-12 13:21:38

标签: angular angular2-directives angular2-components angular2-decorators

我正在试图弄清楚如何访问我们传递给selector装饰器的@Component

例如

@Component({
  selector: 'my-component'
})
class MyComponent {
  constructor() {
     // I was hoping for something like the following but it doesn't exist
     this.component.selector // my-component
  }
}

最终,我想使用它来创建一个自动添加属性data-tag-name="{this.component.selector}"的指令,以便我可以使用Selenium查询通过其选择器可靠地找到我的角度元素。

我没有使用量角器

3 个答案:

答案 0 :(得分:17)

使用-j1

ElementRef

答案 1 :(得分:7)

已过期请参阅https://stackoverflow.com/a/42579760/227299

您需要获取与您的组件关联的元数据:

重要提示运行AOT compiler时,如果您要预编译模板,此解决方案无效,则会删除注释

@Component({
  selector: 'my-component'
})
class MyComponent {
  constructor() {
    // Access `MyComponent` without relying on its name
    var annotations = Reflect.getMetadata('annotations', this.constructor);
    var componentMetadata = annotations.find(annotation => {
      return (annotation instanceof ComponentMetadata);
    });
    var selector = componentMetadata.selector // my-component
  }
}

答案 2 :(得分:1)

如果您需要选择器名称而无需访问组件的 ElementRef,请使用以下替代方法:

const components = [MyComponent];

for (const component of components) {
  const selector = component.ɵcmp.selectors[0][0];
  console.log(selector);
}

老实说,第一种方法感觉相当笨拙,谁知道这个 ɵ 是否应该仅供内部使用?我想我会把它包括在内,这样也许有人可以对它有所了解?

所以,这可能是一条更安全的路线:

constructor(private factory: ComponentFactoryResolver) {
  const components = [MyComponent];

  for (const component of components) {
    const { selector } = this.factory.resolveComponentFactory(component);
    console.log(selector);
  }
}