2013-06-20 8 views
9

私はAngularJSをかなり使い慣れていて、「ログイン」フォームを持つシングルページアプリケーションを試しています。フォームは "ng-submit"によってバインドされ、認証が成功した場合、そのコントローラはトークンを返すAJAX呼び出しを行います。後続のAJAX呼び出しはこのトークンを渡します。 (いいえ、私は基本的な認証を使用したくないのです。なぜなら、非ハックな「ログアウト」ボタンが必要なためです)。ブラウザがフォームフィールドをあらかじめ設定しているとAngularJS "ng-submit"に問題がありますか?

ユーザーがフィールドに空白値でフォームを送信しようとすると、AngularJSは、ツールチップが表示されるように、私は、私のユーザー名とパスワードのフィールド「必要」と設定している:

<form name="loginForm" ng-submit="login()"> 
    <fieldset> 
     <legend>Sign In</legend> 
     <label>Email</label> 
     <input name="loginEmail" type="text" placeholder="Registered email address…" ng-model="loginEmail" required> 
     <label>Password</label> 
     <input name="loginPassword" type="password" placeholder="Password…" ng-model="loginPassword" required> 
     <br/> 
     <button type="submit" class="btn">Login</button> 
    </fieldset> 
</form> 

問題が発生しましたいくつかのブラウザ(少なくともFirefox)は、ユーザがブラウザにユーザ名とパスワードを覚えておき、次回にそれを入力するかどうかを尋ねます。

これらのフィールドのいずれかがブラウザに入力されると、AngularJSは基本的に動作を停止します。 "ng-submit"の送信フォームは送信されません。バインドされたコントローラ機能はまったく呼び出されません。私の最初の考えは、人口密度の高いフィールドがイベントを引き起こさなかったため、AngularJSはまだ空白だと考えていたということでした。しかし、空白のフィールドについて警告するためにポップアップするツールチップはありません。それはちょうど完全にシャットダウンAngularJSのようなものです。

奇妙なことに、いずれかのフィールドに手動で編集するとすぐに、AngularJSが再び有効になります...検証ツールチップとフォーム提出が再び開始されます。

ここにバグがありますか、または私の最後に知識がないという問題がありますか? AngularJSでブラウザに埋め込まれたフィールドを認識させるにはどうすればよいですか?または、この領域に問題がある場合、ブラウザがAngularJSに干渉しないようにフィールドを事前に設定しないようにするにはどうすればよいですか?

+0

を見ることができます。フレームワークやJavaScriptなしでこれを検討してください:http://jsfiddle.net/7GvYj/ – Esailija

+0

面白い!私はAngularJSを操作する前に "required"属性を使用したことがなかったので、そのフレームワークの一部であると仮定しました。元々の問題は、AngularJSの観点からは、ブラウザに埋め込まれたフォームフィールドを認識していないようです。 –

+0

'login'関数が全く呼び出されていないことを確かめてください。 – Esailija

答えて

3

問題は、ブラウザが自動入力でイベントを送信しないという事実に由来します。 Angular's BTの問題として報告されました。

https://github.com/angular/angular.js/issues/1460

しかし、私はそれがその多くのブラウザの問題以来角度から固定されないだろう。

解決策は、タイマを設定し、モデルの状態を「汚れた」状態に設定するか、フォームからイベントをトリガするような汚いハックを行うことです。

あなたはツールチップが、ブラウザの機能を表示する角度ではありませんここにいくつかの試み AngularJS browser autofill workaround by using a directive

+0

情報をいただき、ありがとうございます。私は、事前ログインを静的なページにし、ログイン操作でワンページアプリケーションのページにフルページロード(つまり、Angular以外)を実行させるだけです。 –

5
$(window).load(function() { 
    // updates autofilled fields 
    window.setTimeout(function() { 
    $('input[ng-model]').trigger('input'); 
    }, 100); 
}); 
+1

私のために働いています。私は、ng-submit機能でトリガー機能を呼び出したばかりです。 –

関連する問題