Доступ к возвращенным данным из сервиса в контроллере в AngularJS

#angularjs

#angularjs

Вопрос:

Я работаю в проекте, который имеет интерфейс AngularJS и ASP.NET Серверная часть веб-API.

У меня есть служба, которая вызывает веб-API и возвращает кучу данных JSON. Я пытаюсь получить доступ к этим данным в своем контроллере, но получаю сообщение об ошибке, в котором говорится, что искомое свойство не определено! Свойство, которое мне нужно, — это RegisteredKeeperName .

 $scope.getCrateDetails = function (result, isInsert) {
    $scope.showCrateDetails = true;
    getCrateDetails();

    if (!$scope.premiumCrate.RegisteredKeeperName.toLowerCase().indexOf("Green Farm") > -1) {
        $scope.calloutClass = 'callout-danger';
        $scope.calloutMessage = 'We (Green Farm) cannot provide this service with the necessary documents.';
    } else {
        $scope.calloutMessage = 'All is good!';
    }
};
  

Хотя, когда я распечатываю $scope , я вижу, что свойство, которое мне нужно, заполнено правильной информацией!

 {{premiumCrate.RegisteredKeeperName}}
  

Мой сервисный код выглядит так:

 function getCrateDetails() {
    // service call goes here.
    stockData.GetCrateDetails($scope.premiumCrate.Id).then(
        function (cData) {
            $scope.premiumCrate = cData;
        },
        function () {

        });
};
  

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

1. у вас, должно быть, проблема с асинхронной синхронизацией с ajax. Пожалуйста, покажите ваш код, который загружается RegisteredKeeperName

2. слишком много кода отсутствует, чтобы получить полную картину…

3. Добавлен код службы. Дайте мне знать, если вам потребуется какая-либо другая информация.

Ответ №1:

getCreateDetails это асинхронный вызов (вы пытаетесь использовать данные до того, как они были возвращены и назначены), вы должны return использовать этот вызов .then и получить к нему доступ в контроллере, например:

 function getCrateDetails() {
    return stockData.GetCrateDetails($scope.premiumCrate.Id).then(function (cData) {
        return cData.data;
    }, function () {

    });
};
  

И выполните вызов:

 getCrateDetails().then(function(data) {
    console.log(data); //hey data!
    $scope.premiumCrate = data;

    if (!$scope.premiumCrate.RegisteredKeeperName.toLowerCase().indexOf("Green Farm") > -1) {
        $scope.calloutClass = 'callout-danger';
        $scope.calloutMessage = 'We (Green Farm) cannot provide this service with the necessary documents.';
    } else {
        $scope.calloutMessage = 'All is good!';
    }
});