input
フィールドを使用して、ngChange
のバリアントを適用します。
input
フィールドはajax呼び出しとのバインドの一種です。ユーザーが入力を変更すると、サーバー側がデータを処理しますが、あまり頻繁に呼び出しを行いたくありません。
ユーザーが本当に文字列を入力したい場合、ユーザーが入力しようとしているWordを終了した後にのみ呼び出しが行われるようにします。それにもかかわらず、ぼかしなどのイベントは使いたくありません。 setTimeout
ではなく、これを実装するより良い方法は何でしょうか?
Angular> 1.3でng-model-options
を使用
<input type="text"
ng-model="vm.searchTerm"
ng-change="vm.search(vm.searchTerm)"
ng-model-options="{debounce: 750}" />
ng-model-options
なし-マークアップ内:
<input ng-change="inputChanged()">
バッキングコントローラー/スコープ内
var inputChangedPromise;
$scope.inputChanged = function(){
if(inputChangedPromise){
$timeout.cancel(inputChangedPromise);
}
inputChangedPromise = $timeout(taskToDo,1000);
}
その後、taskToDo
は変更なしで1000ミリ秒後にのみ実行されます。
Angular 1.3の場合、Angular ng-model-optionsディレクティブを使用できます
<input ng-change="inputChanged()" ng-model-options="{debounce:1000}">
独自のディレクティブを作成します-これは、設定した条件に基づいてmyTextでのみコマンドを実行します
<input my-change-directive type="text ng-model="myText" />
.directive('myChangeDirective',function() {
return {
require : 'ngModel',
link : function($scope,$element,$attrs) {
var stringTest = function(_string) {
//test string here, return true
//if you want to process it
}
$element.bind('change',function(e) {
if(stringTest($attrs.ngModel) === true) {
//make ajax call here
//run $scope.$apply() in ajax callback if scope is changed
}
});
}
}
})