Чесно, не зря пишут, что это сложная тема для понимания. Я не понял, как и большинство.
Где использовать вот эту штуку?
Пример:
.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, вот и всё, ничего сложного тут нет.
Комментариев нет:
Отправить комментарий