AngularJS: проблема с областью действия в обратном вызове успеха $http

Я использую PHP для получения данных на моей фабрике, которая правильно отображается в функции обратного вызова успеха в контроллере. Однако даже после назначения возвращаемых данных $scope.customers их там нет, если я выполняю console.log($scope.customers) после обратных вызовов, и мое представление [ng-repeat] также не улавливает их.

Любая идея, почему область моих данных будет ограничена только обратным вызовом успеха, если я назначаю возвращаемые данные моему объекту $scope?

var customersController = function($scope, customersFactory) {
  $scope.customers = [];
  customersFactory.getAllData()
    .success(function(customers) {
      $scope.customers = customers;
      console.log($scope.customers); // Object with correct data
    }); // No errors so only showing happy path
  console.log($scope.customers); // empty []
};
customersModule.controller('customersController', ['$scope', 'customersFactory', customersController]);

person Keith DC    schedule 30.07.2014    source источник
comment
Обратный вызов вызывается после...   -  person coma    schedule 30.07.2014
comment
Это правда, и я должен был больше сфокусировать свой вопрос на том, где я упомянул, что мое представление [ng-repeat] не собирает данные, когда возвращаемые данные назначаются $scope внутри успеха.   -  person Keith DC    schedule 31.07.2014


Ответы (2)


Функции $http выполняются асинхронно. Таким образом, вызов console.log после customersFactory.getAllData всегда будет пустым.

console.log($scope.customers); // Object with correct data

на самом деле происходит ПОСЛЕ

console.log($scope.customers); // empty []

Вы можете доверять обратному вызову успеха, чтобы правильно установить $scope.customers, вам просто нужно, чтобы ваш сайт понимал, что это произойдет позже. Если вам НУЖНО заполнить scope.customers до загрузки представления, рассмотрите возможность использования разрешения на контроллере.

person Fourth    schedule 30.07.2014
comment
Я думал, что представление с ng-repeat привязано к контроллеру, поэтому при обновлении контроллера представление также обновляется. Я был готов сделать предположение, что success() сам по себе в порядке, но не обновляющееся представление - это то, что сбивало меня с толку, когда ng-repeat также не показывал данные. - person Keith DC; 31.07.2014
comment
Вы были правы в том, что данные «присутствуют» в успехе, и нужно просто доверять им и идти с ними, и это стало основой для моего исследования/отладки. Это привело к тому, что я обнаружил проблему, которая заключалась в том, как я ссылался на данные. $scope.customers = customers.goodCustomers; // В представлении нечего отображать, потому что в возвращаемом массиве клиентов есть подмассив типов клиентов. Тем не менее, мне понравилось углубляться и опробовать разрешение маршрутизации, а также узнать о $scope.apply() - очевидно, что ни один из них не применялся, но был хорошим опытом обучения. - person Keith DC; 31.07.2014

Разве это не

console.log($scope.customers); // empty []

выполнение перед

console.log($scope.customers); // Object with correct data

?

Второй находится в обратном вызове success(), поэтому он может выполняться намного позже, чем первый.

person Jonathan Aquino    schedule 30.07.2014
comment
Success() выполняется позже, правильно. Именно на это, я полагаю, ссылается @Fourth. - person Keith DC; 31.07.2014