Страницы

Поиск по вопросам

вторник, 9 октября 2018 г.

Когда использовать scope.$apply();

Чесно, не зря пишут, что это сложная тема для понимания. Я не понял, как и большинство. Где использовать вот эту штуку? Пример: .directive('clickable', function() {
return { restrict: "E",
link: function($scope, element, attrs) { element.bind('click', function() { $scope.$apply(function() { $scope.user++; $scope.bar++; }); console.log('1')
}); } }
}); Без обертки $scope.$apply() пример работать не будет. Не знаю, нашел такую заметку: Важно: любые события браузера вызываются вне области видимости AngularJS, поэтому внутри ваших обработчиков таких событий необходимо вызывать $scope.$apply


Ответ

Так, а что конкретно не понятно? Функции $apply/$digest запускают dirty-check, и если данные в $scope изменились, то обновляют view, вот и вся магия. Когда вы изменяете данные внутри angular, например, на ng-click, он сам вызывает метод $apply, если ваш код выполняется не через angular, то нужно запустить dirty-check руками. Вот очень приблизительные примеры: ng-click внутри себя angular, заменил это конструкцию на: jqLite('button').on('click', function (evt) { evt.preventDefault();
$scope.counter++; $scope.$apply(); }); или $timeout(function () { $scope.foo = "bar"; }, 100);
// эквивалентна setTimeout(function () { $scope.foo = "bar"; $scope.$apply(); }, 100); Всё это очень примерно, но суть в том, что когда вы используете биндинг или методы angular, он за вас вызывает $apply/$digest, вот и всё, ничего сложного тут нет.

Комментариев нет:

Отправить комментарий