1

Ich entwickle eine einfache Angular 2 wiederverwendbare Komponente - ein Captcha-Formularfeld, mit RC5. Ich möchte nicht, dass die Benutzer dieses Moduls @angular/forms bedienen müssen, wenn sie es nicht verwenden (weil die Komponente autark ist).Angular 2: Modul mit bedingter Abhängigkeit von @ angular/forms

Lassen Sie uns einige Code bringen:

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

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

Nun, ich habe dies in irgendeiner Weise zu exportieren, vorzugsweise in einer NgModule:

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

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

Es ist 2 Module - 1 mit @angular/forms Abhängigkeit, die anderes ohne es.

Aber meine Annahme ist, dass das meiste in Verbindung mit @angular/forms verwendet wird, der andere Fall ist eher ein Rand-eins.

Wie kann ich sicherstellen, dass:

  1. Benutzer, die nicht abhängig von @angular/forms es nicht geladen werden muß, wenn CaptchaComponent verwendet wird (dies zur Zeit erreicht wird)
  2. Benutzer, die auf @angular/forms abhängen haben nur auf einen NgModule umfassen (anstelle von sowohl CaptchaModule und CaptchaFormsModule jetzt) ​​
+0

Abhängig davon, wie die Dinge strukturiert sind, kann CaptchaFormsModule ein übergeordnetes Modul für CaptchaModule sein oder beide Module können untergeordnete Module für gemeinsame übergeordnete Elemente sein. – estus

+0

Sieht so aus, als ob das, was ich will, mit 2 Modulen ziemlich leicht erreicht werden kann: 'CaptchaFormsModule' und' CaptchaNoFormsModule', jedes von denen wird die 'CaptchaComponent' bereitstellen. Also müssen die Benutzer nur eine davon anfordern, und die andere wird durch Baumschütteln eliminiert. – Dethariel

+0

Ich persönlich halte eine gute Sache für öffentliche Gegenstände für direkt verfügbar für den Import, wie 'captcha-package/lib/captcha-no "Formen". In diesem Fall muss man sich nicht auf das Baumschütteln verlassen. – estus

Antwort

1

ich landete den Ansatz 2 autarke Module für dieses 2 UseCases unter:

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

und

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

Dies führt zu dem gewünschten Verhalten auf: 1) jede Art von Benutzern die Komponente durch Importieren eine verwenden kann Single Paket und 2) "No-Forms" Benutzer haben nicht die @angular/forms Overhead.