Страницы

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

четверг, 5 декабря 2019 г.

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

#angularjs #javascript


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


Ответы

Ответ 1



Так, а что конкретно не понятно? Функции $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, вот и всё, ничего сложного тут нет.

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

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