当token可以有多个值时,通过Injector.get()获取父组件



我想做的:

  • 使用单个指令的多个不同组件
  • 当指令被调用时,我需要能够获得该指令被调用的父/宿主组件。

Plnkr -> http://plnkr.co/edit/Do4qYfDLtarRQQEBphW3?p=preview

在看角。在io文档中,我发现"注入器"可以用来在构造函数

中获取父组件。
constructor(private el: ElementRef, private hostComponent:Injector){
    el.nativeElement.draggable = 'true';
}

这样做,我得到了注入器对象。据我所知,我应该使用

this.hostComponent.get(INJECTORTOKEN)

我难以理解的问题是,在Angular中提供的示例中,假设你知道要在令牌中提供的组件类型。即:

this.hostComponent.get(Image);
this.hostComponent.get(Box);

在pnkr示例中,我的模板

中有两个组件
<div>
   <h2>Hello {{name}}</h2>
   <my-image></my-image> <!-- Uses the "My Directive" -->
   <my-box></my-box> <!-- Uses the "My Directive" -->
</div>

我的问题是,在"mydirective.ts"。当我不知道父组件是"my-image"还是"my-box"组件时,我如何利用"injector.get()"呢?

在提供的示例

中,指令被"ondrag()"触发。查看控制台,查看日志消息。

感谢您的帮助。

我知道几种方法:

1)通过类接口

找到父类
  • https://angular.io/docs/ts/latest/cookbook/dependency-injection.html !# find-a-parent-by-its-class-interface
您需要提供者的类接口令牌,如:
export abstract class Parent { }

之后,您应该在BoxImage组件上编写别名提供程序

box.ts

providers: [{ provide: Parent, useExisting: forwardRef(() => Box) }]

image.ts

providers: [{ provide: Parent, useExisting: forwardRef(() => Image) }]

然后在你的指令中使用它,如下所示

myDirective.ts

export class MyDirective {
  constructor(@Optional() private parent: Parent){}
  @HostListener('dragstart',['$event']) ondragstart(event){
    switch(this.parent.constructor) {
     case Box:
      console.log('This is Box');
      break;
     case Image:
      console.log('This is Image');
      break;
    }
  }
}

恰好

2)将你所有的父母作为Optional令牌注入

myDirective.ts

export class MyDirective {
  constructor(
    @Optional() private image: Image, 
    @Optional() private box: Box){}
    @HostListener('dragstart',['$event']) ondragstart(event){
      if(this.box) {
        console.log('This is Box');
      }
      if(this.image) {
        console.log('This is Image');
    }
  }
}

Plunker

3)使用Injector like
export class MyDirective {
  constructor(private injector: Injector){}
  @HostListener('dragstart',['$event']) ondragstart(event){
    const boxComp = this.injector.get(Box, 0);
    const imageComp = this.injector.get(Image, 0);
    if(boxComp) {
      console.log('This is Box');
    }
    if(imageComp) {
      console.log('This is Image');
    }
  }
}

恰好

相关内容

  • 没有找到相关文章

最新更新