gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:50:12 24 4
gpt4 key购买 nike

我正在尝试做的事情:

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

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

    在查看 angular.io 文档时,我发现“Injector”可用于获取构造函数中的父组件

    constructor(private el: ElementRef, private hostComponent:Injector){
    el.nativeElement.draggable = 'true';
    }

    在这样做时,我得到了 Injector Object。据我所知,我应该使用

    this.hostComponent.get(INJECTORTOKEN)

    我难以理解的问题是,Angular 中提供的示例假设您知道要在 token 中提供的 Component 类型。 IE:

    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)通过它的类接口(interface)找到一个父级

  • https://angular.io/docs/ts/latest/cookbook/dependency-injection.html#!#find-a-parent-by-its-class-interface

  • 您需要提供者的类接口(interface) token ,例如:

    export abstract class Parent { }

    之后你应该在 Box 上写一个别名提供程序和 Image成分

    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;
    }
    }
    }

    这是 Plunker

    2) 将你所有的 parent 注入(inject)为 Optional token

    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喜欢

    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');
    }
    }
    }

    Plunker

    关于angular - 当 token 可以是多个值时,通过 Injector.get() 获取父组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39986735/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com