Задать вопрос
@schurin
Люблю катать с гор, особенно на санках

Почему на отрабатывает $digest при изменении данных в контроллере?

Доброго дня!
Уже не однократно сталкивался с тем, что меняем данные в контроллере или в директиве, а для применения изменений на странице приходится вызывать $scope.$$phase || $scope.$digest(); либо применять изменения внутри $scope.$apply(function(){//my code}) , в какие моменты отрабатывает $digest?

Пример кода:
(function() {
		'use strict';

		var HomeController = function($scope, productService) {
			var _this = this;
			_this.products = [];

			productService.getProducts()
				.then(function(data) {
					_this.products = data;
				});

			setTimeout(function() {
				_this.products = _this.products.splice(1, 2);
				$scope.$$phase || $scope.$digest();
			}, 3000);
		};

		HomeController.$inject = ['$scope', 'ProductService'];
		angular.module('auction').controller('HomeController', HomeController);
	}());


<ul class="list-unstyled" id="items-list">
      <li class="col-md-4" ng-repeat="product in ctrl.products">
          <div class="row">
              <div class="product-description-holder col-xs-8">
                  <h2><a ng-href="#/product/{{ product.id }}">{{ product.title }}</a></h2>
                  <p>{{ product.description }}</p>
              </div>
          </div>
      </li>
  </ul>

При инициализации контроллера, всё хорошо, ng-repeat наклонирует продуктов, но после изменения переменной _products по таймеру, ожидаю увидеть 2 продукта, что происходит если запустить $digest руками

P.S. SetTimeout использован в качестве примера, мол данные изменяются из вне
  • Вопрос задан
  • 103 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
dasha_programmist
@dasha_programmist
ex Software Engineer at Reddit TS/React/GraphQL/Go
setTimeout замени на $timeout, в метод контроллера соответственно надо инжектить $timeout
мануал
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы