2013-04-04 11 views
26

私は、アプリケーション内の複数のビューで共有されるサブフォームを持っています。 1つのビューでは、このサブフォームは単独で表示され、ユーザーを次のサブフォームに誘導する下部に戻る/続行ボタンが表示されます。別のビューでは、サブフォームは他のサブフォーム(基本的に1つの長いフォーム)と同じページに表示されます。ng-includedフォームの有効性を親スコープから確認するにはどうすればよいですか?

サブフォームのhtmlは両方のビューで100%同一であるため、部分的に分割し、ng-includeを使用してレンダリングしています。バック/継続ボタンを含むサブフォームのみを表示するビューでは、親のHTML内に戻る/続行ボタンを表示します。

視覚的にはすべて正常に動作し、フォームに入力されたすべてのデータにアクセスできます(user.email, user.password, user.etc...)。

問題は、ユーザーがフォームを正しく完了したかどうかに基づいて「続行」ボタンを有効/無効にしていることです。親のスコープがないため「サブフォームのみ」のバリエーションでは機能しませんフォームのステータスにアクセスできるようです。部分的にボタンをスティックすると機能しますが、この部分が使用されているすべてのインスタンスでボタンがそこに属していないため、これを実行したくありません。何かがボックスに入力されるまで、赤枠内のボタンを提出することを私の例では

JSFiddle Example

通知は無効になっている「フォーム無効な?」青い枠内のボタンは常に有効になっており、「フォームが無効ですか?」というメッセージが表示されます。値は空白です。

親スコープからmyForm.$invalidの値にアクセスするにはどうすればよいですか?

+1

フォームは角に巣ができ、子フォームが無効になると親フォームが無効になります。しかし、あなたはあなたのng-includedフォームを囲む外側のフォームを持っていないようです... – jpsimons

+0

入れ子

タグは有効ではありませんHTML:http://stackoverflow.com/questions/4519485/can-i-nest-form-tags -in-other-form-tagsである。技術的にはフィドルで動作しますが、ブラウザーによっては予期せず動作します(例:Chromeは内部のフォームを取り、すべてのスタイリングを取り除きます)。 –

答えて

15

それは、サブフォームの場合は、あなただけのサブフォームからメインフォームにフォームタグを移動することができます。updated JSFiddle

あなたは可能性も巣フォームをngForm-directiveを使用して:

角度形式ではネストすることができます。これは、すべての子フォームが有効な場合でも、外部フォームが有効であることを意味します。しかし、ブラウザは要素の入れ子を許可しません。このため、angleはngFormエイリアスと同じ動作をしますが、フォームの入れ子を許可します。

結果はちょっと混乱します。私はむしろ$親を使用しないように、新しいスコープで「myForm'-ディレクティブを作成したい - のようなもの:

myApp.directive('myForm',function(){ 
    return{ 
     restrict:'E', 
     scope:{model:'='}, 
     templateUrl:'/form.html', 
     replace:true 
    } 
}); 

- このJSFiddle example

+2

最初のオプションは、各「サブフォーム」を個別に検証する必要がある複数ページのフォームであるため、私にとっては機能しません。しかし、(実際の ''タグを入れ子にするのではなく)属性形式で 'ng-form'ディレクティブを入れ子にすると、完全に動作します! '$ parent'部分は単なる悪い例でした - 私はバインドする実際のオブジェクトを持っています。ここで私が使用する完全なソリューションのより良い例があります:[JSFiddle](http://jsfiddle.net/BLVcG/2/)。ありがとう! –

+0

Aha ...しかし、あなたのフォームがモーダルダイアログボックスの中にあり、あなたは外部フォームを持つことができません? –

+2

私はこれがAngularの本当の弱点だと思います。モデル要素ではなくフォーム要素に検証を入れました。したがって、同じモデルに対して複数のフォームを定義する場合は、すべての検証ロジックを繰り返す必要があります。 –

25

、使用時に作成した子スコープでNGが、含ま見ます親からフォーム関数を隠す。ディレクティブを使用することに加えて

、あなたも親にオブジェクトを追加することができますが、それはそうのようなプロパティを持つオブジェクトにフォームの名前を設定することが重要です:

<form name="myFormHolder.myForm"> 

とで親コントローラ

$scope.myFormHolder = {}; 

その後、次のように動作するはずです:

$scope.myFormHolder.myForm.$pristine 

こう番目eフォームが評価されると、myForm。$ validが親に設定されます。 Why form undefined inside ng-include when checking $pristine or $setDirty()?

+1

これは受け入れられる答えのようです。非常に有用なおかげで! – gabereal

+0

これは私の問題を完全に修正しました。私は、ng-repeatに接続されたディレクティブを介してメインテンプレートの各子スコープが設定されたhtmlテンプレートを用意しています。これは、検証を表示するための素晴らしいソリューションでした。 – mortey

+0

これはかなりクリーンな方法です。 – Skrew

関連する問題