【问题标题】:Encapsulate existing angular library components with our own angular component?用我们自己的角度组件封装现有的角度库组件?
【发布时间】:2019-11-05 04:39:39
【问题描述】:

这是我的问题。我想用我的组件封装剑道角度组件。例如,kendo-button 组件被称为 my-button。我们正在尝试创建我们的选择器,以便即使我们将来使用其他库更改 kendo,它也不会影响开发中的现有组件,因为它们将使用自定义包装器组件。当然,你手动创建一个包装器组件。

但是是否可以在我们的自定义组件下自动构建库组件,或者是否可以使用我们的选择器名称更改 kendo 或任何其他库组件选择器。寻找一些可以帮助我实现这一目标的工具或功能。

【问题讨论】:

  • 不太可能。我不认为这样的事情存在。每个图书馆都不一样。组件不仅仅是选择器。
  • 是的,我同意组件还有更多内容,而不仅仅是选择器。我们有一些我们已经封装的组件,但都是手动的。这意味着 kendo 组件上的所有事件和可能的输入都在自定义组件上重复,这非常麻烦并且容易出错或需要大量维护。
  • @Darksilence 这样想。您多久更换一次使用的库?正如您所说,封装复杂组件的工作量太大。如果您需要更改您使用的库,请使用此时间。正如他们所说,“过早的优化是万恶之源”

标签: javascript angular angularjs-directive kendo-ui-angular2


【解决方案1】:

从 PrimeNG 组件库迁移到 Material 库后,我们不得不手动重新实现每个组件实例,我们遇到了完全相同的挑战。展望未来,我们希望尽可能地将库组件与应用程序分离,以便在我们决定再次更改库时,替换它会更容易。

一般的想法是创建一个应用程序组件,该组件将充当库组件的传递组件,并且所有公开的功能都将在组件实现的接口中定义。

下面是一个(相当)通用且简单的示例:

|-- Components
     |-- button
          |-- button.component.css
          |-- button.component.html
          |-- button.component.ts
          |-- button.model.ts
          |-- button.module.ts

组件文件是使用 CLI 生成的标准文件。 .model.ts 文件包含组件的接口,.module.ts 文件包含同样使用 CLI 生成的 Angular 模块。

button.component.html

<button (click)="clicked()"><i [ngClass]="icon"></i>{{text}}</button>

button.component.ts

import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
import { IButton } from './button.model';

@Component({
  selector: 'app-button',
  templateUrl: './button.component.html',
  styleUrls: ['./button.component.css']
})
export class ButtonComponent implements OnInit, IButton {

  @Input() text: string;
  @Input() icon: string;

  @Output() clickEvent: EventEmitter<void> = new EventEmitter<void>();

  constructor() { }

  ngOnInit() {
  }

  clicked(): void {
    this.clickEvent.emit();
  }

}

将所有输入和输出(尽可能通用)定义为组件(以及任何未来实现)需要实现的接口。这将确保组件的功能始终保持不变。

button.model.ts

import { EventEmitter } from '@angular/core';

export interface IButton {
    text: string;
    icon: string;
    clickEvent: EventEmitter<void>;
}

在模块中声明并导出组件。

button.module.ts

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ButtonComponent } from './button.component';

@NgModule({
  declarations: [
    ButtonComponent
  ],
  imports: [
    CommonModule,
    // component module imports here
  ],
  exports: [
    ButtonComponent
  ]
})
export class ButtonModule { }

遵循上述方法意味着您只需导入模块即可在您的应用中引用该组件 - 您永远不会直接引用库组件。

<app-button [text]="'export'" [icon]="'fas fa-file-export'" (clickEvent)="doSomething()"></app-button>

如果您需要替换或扩展组件,请对模块(例如导入库组件模块)、模板进行必要的更改,并确保组件仍然实现接口。

【讨论】:

  • 这对于小型组件来说是一个可行的解决方案,但大多数库都有具有数十个输入和输出的复杂组件。必须重新定义一切似乎太麻烦了。
猜你喜欢
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 2022-07-09
相关资源
最近更新 更多