2016-04-20 2 views
1

Я новичок в angularjs, который я исследовал в Интернете, но я не мог найти подходящего решения для своей проблемы. Я сделал http-вызов, чтобы получить некоторые данные от контроллера. Сторона контроллера в порядке. Но клиентская сторона, обещание не ждет данных. Здесь коды, которые я написал;MVC и Angularjs: обещание не ждет данных

//service code 
angular.module("myApp").service('$myService', function ($http, $q) { 
      this.getDataArray = function() { 
       var deferred = $q.defer(); 
       $http.get('../Home/GetDataArray') 
        .success(function success(response) { 
         deferred.resolve(response); 
        }) 
        .error(function() { 
         console.log("error getting data array"); 
         deferred.reject(); 
        }); 

       return deferred.promise; 
      }; 
    } 

// controller-code 
angular.module("myApp").controller('dataController', function ($scope, $http, $myService) { 

     $scope.getDataFromService = function() { 
      $myService.getDataArray().then(function (response) { 
        $scope.dataArray = response.data; 
       }); 
     }; 
    }); 
} 

Когда я вызвать метод getDataFromService сначала $ scope.dataArray пуст, но второй вызов, $ scope.dataArray заполняется данными. В чем проблема? Спасибо за помощь.

+0

Вы можете проверить результат первого HTTP-вызова в инструментах fiddler/chrome dev? – fikkatra

+0

Я также проверил его, но когда я сделал первый вызов, $ scope.dataArray пуст, потому что обещание не ждет, так как я сказал –

+0

Я не имею в виду $ scope.data, я имею в виду сам HTTP-вызов. Вы абсолютно уверены, что ответ первого вызова (как видно из инструментов Chrome dev) содержит данные? – fikkatra

ответ

0

Не являюсь экспертом по углу. Это именно то, как я это сделал, когда столкнулся с той же проблемой. Попробуйте это:

Контроллер:

angular.module("myApp").controller('dataController',[ '$scope', 'Service1', '$http', function ($scope, Service1, $http) { 
    var deferred = Service1.getDataArray().$promise; 
      return deferred.then(function successCallback(data, status, headers, config) { 
       // this callback will be called asynchronously 
       // when the response is available 
       $scope.dataArray = response.data; 
      }, function errorCallback(response) { 
       // called asynchronously if an error occurs 
       // or server returns response with an error status. 
      }) 
    }]) 

и обслуживание:

var service = angular.module("myApp").service('myService', ['ngResource']); 
    myService.factory('Service1', ['$resource', 
    function ($resource) { 
     return $resource('../Home/GetDataArray', {}, { 
      get: { method: 'GET', isArray: true }, 
     }); 
    }]) 

Идея заключается в том, что ваш сервис не тот, который должен ждать возвращения, ваш контроллер. Поэтому вы должны ждать, пока обещание в вашем контроллере не будет вашим сервисом. В моем примере я использую фабрики, потому что, как бы я ни обошел это в своем проекте, вы можете попробовать и реализовать это напрямую, если не хотите использовать фабрику.

+0

Спасибо за помощь, этот подход решает мою проблему. –

Смежные вопросы