Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
От переводчика: если вам понравилась статья, то лучшая благодарность — зеленая стрелочка в профиле. Спасибо :)
$scope.$digest() (который обновит только скоуп компонента) вместо $scope.$apply(), который обновляет состояние всех скоупов, начиная с корня ($rootScope).app.directive('changeTimeout', function() {
return {
require: 'ngModel',
link: function(scope, elem, attr, ctrl) {
if (!attr.ngChange) {
throw new TypeError('ng-change directive not present');
}
angular.forEach(ctrl.$viewChangeListeners, function(listener, index) {
ctrl.$viewChangeListeners[index] = _.debounce(function() {
scope.$apply(attr.ngChange);
}, attr.changeTimeout || 0)
});
}
}
});
angular.module('ngDebounce', []).config ['$provide', ($provide) ->
$provide.decorator '$timeout', ['$delegate', '$q', ($delegate, $q) ->
$delegate.debounce = (func, wait, immediate) ->
timeout = undefined
deferred = $q.defer()
(->
context = this
args = arguments
later = ->
timeout = null
unless immediate
deferred.resolve func.apply(context, args)
deferred = $q.defer()
callNow = immediate and not timeout
$delegate.cancel timeout if timeout
timeout = $delegate(later, wait)
if callNow
deferred.resolve func.apply(context, args)
deferred = $q.defer()
deferred.promise)
return $delegate
]
]
Дросселирование ввода на AngularJS с помощью debounce