[解決済み] angularjsでフォームをリセットするにはどうしたらいいですか?
質問
フィドルをご覧ください。 http://jsfiddle.net/hejado/7bqjqc2w/
angularを使ってform.reset()しようとしているのですが、どうすればいいですか?
HTMLです。
<div ng-controller="formCtrl">
<form name="resetme" id="resetme">
<input ng-model="text" type="text" />
<input file-model="file" type="file" />
<button type="button" ng-click="resetForm()">reset</button>
</form>
</div>
JSです。
.controller('formCtrl', function($scope) {
$scope.resetForm = function() {
//$scope.resetme.reset();
document.getElementById('resetme').reset();
};
});
ご注意ください。 このようなフォームを使って、ファイルをajaxアップロードしています。ページは更新されないので、リセットボタンは使いたくありません。(簡単のためにフィドルで1つ使っています。) ファイルアップロードが終了した後、reset-functionを呼び出したいのです(http success経由で)。
を使っています。
<input type="file" />
というわけで、ファイル入力は読み取り専用なので、すべての入力に空の値を再割り当てすることはできません。
DOM要素にreset()関数を呼び出すとうまくいきますが、angularでDOMに話しかけるのは邪道だと言われたので...。
知りたいのは、これがどのように行われるかというと アンギュラーウェイ . フォームに名前を付けて、$scopeで参照してみました。 フォーム名 が、Web API 関数を呼び出すことができない......。(コメント行)
どうすれば実現できますか?
アップデイト いくつかの回答を読んだ後、私はngModelとカスタムディレクティブを使っていることを明確にする必要があります。 ファイルモデル を使用して、ファイル・オブジェクトを取得します。
いくつかの解決策は、入力フィールドの値をリセットすることに成功しましたが、モデルはクリアされません(ファイルでもテキストでもありません)。カスタムディレクティブがその答えですが、これはちょっとこの質問の範囲を超えています。
解決方法は?
について書きました。 このトピック 数年前のことです。Angularチームがまだネイティブのフォームリセットディレクティブを実装しているかどうかは知りませんが、自分で実装することは可能です。この実装にはいくつかの注意点があります: これは1つのモデルに対してのみ動作します。 ポスト ) と、元の値をいつ初期化するかという問題があります。また、ファイル入力でのテストはしていませんので、ファイル入力で動作するかどうかはわかりません。
がありました。 問題 しかし、それは活動停止のために閉鎖されました。
var myApp = angular.module('myApp', []);
myApp.controller('MyCtrl', ['$scope',
function($scope) {
$scope.myModel = {
foo: 'Boop',
bar: 'Beep'
};
$scope.myModelCopy = angular.copy($scope.myModel);
}
]);
myApp.directive('resetDirective', ['$parse',
function($parse) {
return function(scope, element, attr) {
var fn = $parse(attr.resetDirective);
var masterModel = angular.copy(fn(scope));
// Error check to see if expression returned a model
if (!fn.assign) {
throw Error('Expression is required to be a model: ' + attr.resetDirective);
}
element.bind('reset', function(event) {
scope.$apply(function() {
fn.assign(scope, angular.copy(masterModel));
scope.form.$setPristine();
});
// TODO: memoize prevention method
if (event.preventDefault) {
return event.preventDefault();
} else {
return false;
}
});
};
}
]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<body ng-app="myApp">
<div ng-controller="MyCtrl">
<form reset-directive="myModel" name="form">
<input type="text" ng-model="myModel.foo" />
<input type="text" ng-model="myModel.bar" />
<input type="reset" value="Reset" />
<pre>myModel: {{ myModel | json }}</pre>
<pre>myModelCopy: {{ myModelCopy | json }}</pre>
<pre>form pristine: {{ form.$pristine }}</pre>
</form>
</div>
</body>
関連
-
[解決済み】TypeError: $(...).DataTable は関数ではありません。
-
[解決済み】React Js: Uncaught (in promise) SyntaxError: 位置 0 の JSON で予期しないトークン < が発生しました。
-
[解決済み] 解決済み】clearInterval()が動作しない [重複] [重複]
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] jQueryで要素が非表示になっているかどうかを確認するには?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み] AngularJSでデータバインディングはどのように機能するのですか?
-
[解決済み】別のウェブページにリダイレクトするにはどうすればいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Facebook Graph API のクエリで with=location を使用すると "Uncaught (in promise) undefined" というエラーが発生する。
-
[解決済み】 Uncaught TypeError: data.push is not a function
-
[解決済み】Uncaught TypeError: nullのプロパティ'value'を読み取ることができない
-
[解決済み】「Uncaught TypeError: Chromeで "Illegal invocation "が発生する。
-
[解決済み】コンソールがUnterminated JSX contentsエラーを投げる【終了しました
-
[解決済み】エラー:リスン EACCES 0.0.0.0:80 OSx Node.js
-
[解決済み] ローカルファイルを開くことができません - Chrome: ローカルリソースのロードが許可されていません
-
[解決済み】Jestが予期しないトークンに遭遇した
-
[解決済み】このオブジェクトの "forEach "はなぜ関数でないのですか?
-
[解決済み】AngularJs:ファイル入力フィールドの変更をチェックする方法は?