検索に使用している次の入力フィールドがあります。
<input id="search_input" type="text" ng-model="filter.search_terms">
私が使用している他の多くのフィルター(チェックボックス、ラジオなど)もあり、フィルターに$ watchを設定しているため、変更を加えると検索が実行されます。問題は、文字を入力するたびにテキストフィールドの検索が実行されないようにして、Enterキーを押したときにのみfilter.search_termsにそれを「保存」することです。
これを行う簡単な方法はありますか、またはng-modelを削除して、Enterで設定する関数を使用してng-clickを実行する必要がありますか?
追加してみてくださいng-model-options="{updateOn : 'change blur'}"
を入力タグに追加します。うまくいくはずです。
ここでの回答はどちらも質問に完全には答えていないようです。問題は、Enterキーを押したときにのみモデルを更新する方法でした。元のポスターは進んでいると思いますが、これを見つける可能性のある人のために、私のアプローチを追加します。忍者ピクセルが一番近いと思います。私の返答は彼の指示に基づいています。
ただし、欠落している部分が原因で、デフォルトのng-modelディレクティブが他の場合に更新されません。そのために、キーアップ時に更新するオプションを入力に追加しました。
ng-model-options="{updateOn: 'keyup'}"
これは、(テキストフィールドの)入力イベントで更新するデフォルトをオーバーライドし、キーアップ時に更新を強制的に実行します。これにより、カスタムキーアップハンドラーでイベントの伝播を停止することにより、元のng-modelディレクティブのデフォルトアクションを防ぐことができます。
if (ev.keyCode !== 13) return ev.stopImmediatePropagation();
動作するコードペンはここにあります: http://codepen.io/jessehouchins/pen/MbmEgM
updateOnEnter
というディレクティブを作成し、この属性をHTML要素に追加することで、この動作を実現できます。
<input id="search_input" type="text" update-on-enter ng-model="filter.search_terms">
angular.module('app').directive('updateOnEnter', function() {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attrs, ctrl) {
element.on("keyup", function(ev) {
if (ev.keyCode == 13) {
ctrl.$commitViewValue();
scope.$apply(ctrl.$setTouched);
}
});
}
}
});