2017-12-19 16 views
2

私は最後のAngular Connect https://youtu.be/CD_t3m2WMM8?t=20m22sでKara Ericksonが推奨するカスタムControlValueAccessorを実装しようとしています。有効な状態を親コンポーネントから子コンポーネントに渡すこと。エラー:NgControl Angular AOTのプロバイダがありません

app.component.html:

<app-country-select ngModel="model" name="country-select"></app-country-select> 

国-select.component.html:

<select [formControl]="controlDir.control" #select placeholder="Country" i18n-placeholder (click)="onTouched()" 
     (change)="onChange($event.value)" [required]="required"> 
    <option value="at">Austria</option> 
    <option value="au">Australia</option> 
</select> 

国-select.component.ts:

@Component({ 
    selector: 'app-country-select', 
    templateUrl: './country-select.component.html', 
    styleUrls: ['./country-select.component.scss'], 
}) 
export class CountrySelectComponent implements ControlValueAccessor { 

    @Input() required = false; 

    @ViewChild('select') select: HTMLSelectElement; 

    onChange: (value: any) => void; 
    onTouched:() => void; 

    constructor(@Self() public controlDir: NgControl) { 
     controlDir.valueAccessor = this; 

    } 
... 
} 

完全なコードここに住んでいる:https://github.com/maksymzav/ngcontrol

JITモードで実行すると、コードは完全に機能します。 NgModel、FormControlName、またはFormControlDirectiveは、実行時にどのコントロールが使用されているかを知っているからだと思います。 しかし、私はAOTはng build --prodでビルドを実行するときには、メッセージ

のエラーで失敗します。NgControlなしプロバイダ( "[ERROR - >] <アプリ - 国を選択> < /アプリ-国を選択>" )

誰でもこのビルドを成功させる方法を知っていますか?ありがとうございました。

+1

おそらく、formタグで生成されたHTMLを包むの​​を忘れていました。 – Igor

+0

この投稿を参照してください:https://stackoverflow.com/questions/37284763/using-ngcontrol-caused-error-no-provider-for-controlcontainer – lemmingworks

+0

@Igor、あなたはapp.componentでコードをラップすることを意味しますか?フォームタグにhtml?残念ながら助けにならないでしょう。 –

答えて

0

controlDir@Optional()デコレータを追加できます。

依存性をオプションとしてマークするパラメータメタデータ。インジェクタ は、依存関係が見つからない場合はnullを返します。

私の場合、「プロバイダなし」というエラーが解決され、プロジェクトを正常にコンパイルできました。

例:

constructor(
    @Optional() // Add this decorator 
    @Self() 
    public controlDir: NgControl, 
    private stripe: StripeService, 
    private cd: ChangeDetectorRef 
) { 
    // Better to add some checks here since controlDir can be null 
    if (controlDir) { 
    controlDir.valueAccessor = this; 
    } 
} 
関連する問題