Angular 2:条件依赖于“@angular/forms”的模块

Angular 2: module with conditional dependency on `@angular/forms`

我正在开发一个简单的 Angular 2 可重用组件 - 验证码表单字段,使用 RC5。我不希望这个模块的用户在不使用它时必须服务 @angular/forms(因为该组件是自给自足的)。

让我们加入一些代码:

// Independent of '@angular/forms'
@Component({
  selector: 'my-captcha',
  template: `...`,
})
export class CaptchaComponent {}

// Depends on '@angular/forms'
@Directive({ selector: 'my-captcha' })
export class CaptchaValueAccessorDirective {}

现在,我必须以某种方式导出它,最好是 NgModule:

@NgModule({
  declarations: [ CaptchaComponent ],
  exports: [ CaptchaComponent ],
})
export class CaptchaModule {}

@NgModule({
  declarations: [ CaptchaValueAccessorDirective ],
  exports: [ CaptchaValueAccessorDirective ],
  imports: [ FormsModule ],
})
export class CaptchaFormsModule {}

它有 2 个模块 - 1 个具有 @angular/forms 依赖性,另一个没有。

但我的假设是,大多数情况下这将与 @angular/forms 结合使用,另一种情况更像是一个优势。

我如何确保:

  1. 不依赖@angular/forms的用户在使用CaptchaComponent时不用加载(目前已经实现)
  2. 确实依赖 @angular/forms 的用户必须只包含一个 NgModule(而不是 CaptchaModuleCaptchaFormsModule现在)

我最终为这 2 个用例采用了 2 个自给自足模块的方法:

// captcha-package/index.ts
@NgModule({
  declarations: [ CaptchaComponent, CaptchaValueAccessorDirective ],
  exports: [ CaptchaComponent, CaptchaValueAccessorDirective ],
  imports: [ FormsModule ],
}) export class CaptchaFormsModule {}
...
import { CaptchaFormsModule } from 'captcha-package';

// captcha-package/captcha-noforms.ts
@NgModule({
  declarations: [ CaptchaComponent ],
  exports: [ CaptchaComponent ],
}) export class CaptchaNoFormsModule {}
...
import { CaptchaNoFormsModule } from 'captcha-package/captcha-noforms';

这会导致预期的行为:1) 每种类型的用户都可以通过导入 单个 包来使用该组件,并且 2) "no-forms" 用户没有@angular/forms开销。