【问题标题】:Dependency inject components in AngularAngular 中的依赖注入组件
【发布时间】:2020-06-15 09:48:07
【问题描述】:

是否可以在 Angular 中以某种方式依赖注入组件?我希望能够做一些类似于你可以用服务做的事情,例如:

my.module.ts:
providers: [
   {
      provide: MyService,
      useClass: CustomService
   }
]

我尝试在包装组件中使用 *ngIf="condition",但它会抱怨没有为我不想使用的组件提供服务。

【问题讨论】:

    标签: javascript angular typescript angular8 angular-dependency-injection


    【解决方案1】:

    如果组件和注入组件之间有父子关系,这是完全可能的。 所以如果你有这样的结构

    @Component( {
        selector:"app-parent",
        template:" <app-child> </app-child>"
     } )
    export class ParentComp { ...}
    

    你可以通过依赖注入在子组件中注入父组件

    @Component({
        selector:"app-child",
         template:"I am child"
     })
    export class ChildComponent{
        constructor(private parentComp:ParentComponent){
    }
    }
    

    Angular DI 现在您正在请求子组件所在的父组件,并将为您注入它。

    如果你想注入组件而不是父子关系,例如你想将sidenav组件注入到位于sidenav之外的某个表格组件中,这是很难实现的(也不推荐),但可能。如果你想这样做,你可能应该创建共享服务,它将在这些组件之间共享状态。

    【讨论】:

    • 对不起,我可能应该澄清一下,我想将组件注入到 html 中,类似于您使用 ngIf 的方式,但我不想为设置为 *ngIf="false" 的组件提供服务
    【解决方案2】:

    当然,您可以为特定的注入令牌提供任何值(常量、函数、类)。当我们要制作ControlValueAccessor时,您可以找到一些组件提供的示例

    @Component({
    providers: [     
       { 
         provide: NG_VALUE_ACCESSOR, 
         useExisting: forwardRef(() => CustomInputComponent),
         multi: true     
        }   
    ]
    })
    export class CustomInputComponent {...}
    

    您可以创建自己的注入令牌并提供您想要的任何东西和组件。

    /* In tokens.ts */ 
    const MY_TOKEN_NAME = new InjectionToken<MyAmazingComponent>('MY_TOKEN_NAME')
    
    /* In module */    
    providers: [
      { provide: MY_TOKEN_NAME, useClass: MyAmazingComponent }
    ]
    

    【讨论】:

    • 感谢弗拉德的帮助。在我想要替换组件的 html 文件中它会是什么样子。只是吗?
    • 哦,对不起,我误解了你的情况。你最好摆脱 DI 的访问父/子。最佳实践是使用输入/输出或存储在服务中的某些条件来组织这种通信,并且访问不是“component.condition”而是“service.condition”
    猜你喜欢
    • 2016-09-15
    • 2016-09-10
    • 1970-01-01
    • 2016-09-14
    • 2017-05-24
    • 2018-06-10
    • 1970-01-01
    • 2015-04-08
    相关资源
    最近更新 更多