Angular:在组件内使用通用组件

Posted

技术标签:

【中文标题】Angular:在组件内使用通用组件【英文标题】:Angular: Using generic component inside a component 【发布时间】:2020-08-14 04:29:27 【问题描述】:

我正在使用 nrwl/nx。我的项目有 2 个角度应用程序和 1 个库。在这个库中,有 1 个组件和 2 个服务。两个应用使用相同的组件,但服务不同。

如何使用相同的组件但使用不同的服务?

服务具有相同的属性键,但功能不同。

我正在考虑在 *** 上声明一个像这篇文章这样的通用组件:Declare a component with generic type 我试过这个。代码如下:

import  Component, OnInit  from '@angular/core';

@Component(
   selector: 'cms-login',
   templateUrl: './login.component.html',
   styleUrls: ['./login.component.scss']
)
export class BaseLoginComponent<T> implements OnInit 
   constructor(private loginService: T)  

   ngOnInit(): void 
      this.loginService.getUser(); // tells property 'getUser()' does not exist in 'T'
   

这是我的服务中的代码

@Injectable(
  providedIn: LoginModule
)
export class LoginService 
  private currentUserSubject: BehaviorSubject<UserEntity>;
  public currentUser: Observable<UserEntity>;

  public currentUserValue(): UserEntity 
    // different code
    return  id: 1, username: '' 
  

  login(): Observable<any> 
    // different code
    return of(null);
  

  logout()  

我也想用依赖注入做一些事情,但我不知道如何实现它。

【问题讨论】:

这些不同的服务有什么共同点? 你能更详细地描述你需要什么吗? @BunyaminCoskuner 它们共享相同的属性键,但它们没有相同的功能。一项服务通过 google auth 授权用户,另一项向我的后端服务器发送 http 请求 好的,所以他们都尝试通过不同的调用登录用户。所以它们有一个共同的功能。还有一个问题,你应该把这些服务放在哪里?在库或应用程序中? 【参考方案1】:

你可以尝试如下

在图书馆

    提供令牌

    export const TOKEN_API = new InjectionToken('api');

    提供接口

    接口 IServiceInterface

    在组件中通过令牌注入服务

@Component()
export class MyComponent 
  constructor(@Inject(TOKEN_API) private api: IServiceInterface) 
  

在应用程序中您可以为注入令牌提供专用服务

@NgModule(
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule
  ],
  providers: [
     provide: TOKEN_API, useClass: MyServiceImplementation
  ],
  bootstrap: [AppComponent]
)

//dedicate service
export class MyServiceImplementation implements IServiceInterface 

【讨论】:

以上是关于Angular:在组件内使用通用组件的主要内容,如果未能解决你的问题,请参考以下文章

Angular - 在 OnInit 上进行不同 API 调用的通用组件

Angular4 后台管理系统搭建(10) - 做一个通用的可跨域上传文件的组件

[ionic3.x开发记录]参考ionic的float-label动效,写一个项目内通用的input组件,易扩展

Angular 9 通用错误:组件“HeaderComponent”未解决:

Angular 单元测试:使用泛型创建组件

Angular - 创建通用装饰器包装 @HostListener