2017-11-01 24 views
1

EDIT:問題の原因を発見しました。私は今、どのようにそれに対応するための解決策を探しています。DevモードでNgFormエラーのプロバイダがありません。4.4.6

:この問題は、DEVモードで起こっている(つまり、AOTを使用してをprod、およびないではない)

私はここから "更新" ソリューションを使用しています:

https://stackoverflow.com/a/46324043/3164070

をフォーム上の有効なフラグを更新していない子コンポーネントの入力に関する問題を解決します。しかし、かなり単純なテストプロジェクトで働く私たちの本当のプロジェクトに移動するとき、それは、このエラーがスローされます。

core.es5.js:1020 ERROR Error: Uncaught (in promise): Error: No provider for NgForm! 
Error: No provider for NgForm! 
    at ZoneAwareError (http://192.168.2.34:4200/vendor.bundle.js:153804:33) 
    at injectionError (http://192.168.2.34:4200/vendor.bundle.js:1378:90) 
    at noProviderError (http://192.168.2.34:4200/vendor.bundle.js:1416:12) 
    at ReflectiveInjector_._throwOrNull (http://192.168.2.34:4200/vendor.bundle.js:2858:19) 
    at ReflectiveInjector_._getByKeyDefault (http://192.168.2.34:4200/vendor.bundle.js:2897:25) 
    at ReflectiveInjector_._getByKey (http://192.168.2.34:4200/vendor.bundle.js:2829:25) 
    at ReflectiveInjector_.get (http://192.168.2.34:4200/vendor.bundle.js:2698:21) 
    at resolveNgModuleDep (http://192.168.2.34:4200/vendor.bundle.js:9701:25) 
    at NgModuleRef_.get (http://192.168.2.34:4200/vendor.bundle.js:10771:16) 
    at resolveDep (http://192.168.2.34:4200/vendor.bundle.js:11259:45) 
    at _createProviderInstance (http://192.168.2.34:4200/vendor.bundle.js:11102:20) 
    at resolveDep (http://192.168.2.34:4200/vendor.bundle.js:11238:56) 
    at createClass (http://192.168.2.34:4200/vendor.bundle.js:11129:32) 
    at createDirectiveInstance (http://192.168.2.34:4200/vendor.bundle.js:10960:37) 
    at createViewNodes (http://192.168.2.34:4200/vendor.bundle.js:12401:53) 
    at ZoneAwareError (http://192.168.2.34:4200/vendor.bundle.js:153804:33) 
    at injectionError (http://192.168.2.34:4200/vendor.bundle.js:1378:90) 
    at noProviderError (http://192.168.2.34:4200/vendor.bundle.js:1416:12) 
    at ReflectiveInjector_._throwOrNull (http://192.168.2.34:4200/vendor.bundle.js:2858:19) 
    at ReflectiveInjector_._getByKeyDefault (http://192.168.2.34:4200/vendor.bundle.js:2897:25) 
    at ReflectiveInjector_._getByKey (http://192.168.2.34:4200/vendor.bundle.js:2829:25) 
    at ReflectiveInjector_.get (http://192.168.2.34:4200/vendor.bundle.js:2698:21) 
    at resolveNgModuleDep (http://192.168.2.34:4200/vendor.bundle.js:9701:25) 
    at NgModuleRef_.get (http://192.168.2.34:4200/vendor.bundle.js:10771:16) 
    at resolveDep (http://192.168.2.34:4200/vendor.bundle.js:11259:45) 
    at _createProviderInstance (http://192.168.2.34:4200/vendor.bundle.js:11102:20) 
    at resolveDep (http://192.168.2.34:4200/vendor.bundle.js:11238:56) 
    at createClass (http://192.168.2.34:4200/vendor.bundle.js:11129:32) 
    at createDirectiveInstance (http://192.168.2.34:4200/vendor.bundle.js:10960:37) 
    at createViewNodes (http://192.168.2.34:4200/vendor.bundle.js:12401:53) 
    at resolvePromise (http://192.168.2.34:4200/vendor.bundle.js:153599:31) [angular] 
    at resolvePromise (http://192.168.2.34:4200/vendor.bundle.js:153570:17) [angular] 
    at http://192.168.2.34:4200/vendor.bundle.js:153647:17 [angular] 
    at Object.onInvokeTask (http://192.168.2.34:4200/vendor.bundle.js:4090:33) [angular] 
    at ZoneDelegate.invokeTask (http://192.168.2.34:4200/vendor.bundle.js:153284:36) [angular] 
    at Zone.runTask (http://192.168.2.34:4200/vendor.bundle.js:153052:47) [<root> => angular] 
    at drainMicroTaskQueue (http://192.168.2.34:4200/vendor.bundle.js:153480:35) [<root>] 
    at <anonymous> [<root>] 

問題は、同じコンポーネントをフォームにせずに使用できることではありませんので、何もありNgFormのプロバイダ。

フォームがない場合に、viewProvidersメンバーを動的に使用する方法はありますか?親NgFormプロバイダが存在しない場合

答えて

1

うん、あなたはケースにnullとしてそれを提供することができます。

export function controlContainerFactory(controlContainer?: ControlContainer) { 
    return controlContainer; 
} 

... 

viewProviders: [ 
    { 
    provide: ControlContainer, 
    useFactory: controlContainerFactory, 
    deps: [[new Optional(), NgForm]] 
      ^^^^^^^^^^ 
      should do the trick 
    } 
] 

Stackblitz example

+0

あなたは伝説です。ありがとう! –

関連する問題