2013-07-17 2 views
0

У меня есть поставщик:отключенное свойство объекта

AdviceList.provider('$adviceList',function(){ 
    this.$get = function ($rootScope,$document,$compile,$http,$purr){ 

     function AdviceList(){ 

      $http.post('../sys/core/fetchTreatments.php').success(function(data,status){ 
       this.treatments = data; 
       console.log(this.treatments); // the correct object 
      }); 

      this.adviceCategories = [ 
       // available in the controller 
      ]; 

     } 
     return{ 

      AdviceList: function(){ 
       return new AdviceList(); 
      } 
     } 
    } 
}); 

Кроме того, у меня есть этот контроллер:

AdviceList.controller('AdviceListCtrl',function($scope,$adviceList){ 
    var adv = $adviceList.AdviceList(); 
    $scope.treatments = adv.treatments; // undefined 
}); 

Почему это, что диспетчерское $scope.treatments остается неопределенным, this.treatments внутри провайдера однако, правильно заполнены? Кроме того, adviceCategories доступен в моем контроллере.

ответ

1

Звонок, которому вы получаете сокет, является асинхронным, поэтому результаты могут быть не заполнены, когда вы пытаетесь их назначить.

Так вот

var adv = $adviceList.AdviceList(); 
$scope.treatments = adv.treatments; //The treatments would only get filled after the server call is over. 

Вам нужно переписать код таким образом, что вы назначаете его в области видимости собственности на обратный вызов.

+0

спасибо. Не могли бы вы поделиться ссылкой на простой пример, если у вас его совпадение? – user2422960

1

Я рекомендую вам, чтобы упростить код

1) Используйте простой метод заводского угловой вместо поставщика

2) вернуть обещание избегать использования обратных вызовов

AdviceList.service('adviceList', function ($http) { 
      return { 
       adviceList: function() { 
        return $http.post('../sys/core/fetchTreatments.php'); 
       } 
      } 
     }); 

     AdviceList.controller('AdviceListCtrl', function ($scope, $adviceList) { 
      adviceList.AdviceList().then(function (data) { 
       $scope.treatments = data //set value to data when data is recieved from server 
      }); 

     }); 
+0

Спасибо. Не могли бы вы вкратце объяснить преимущества выбора услуги над провайдером, помимо менее сложного синтаксиса? Я бы подумал, что всегда полезно использовать поставщика, поскольку они настраиваются. – user2422960

+0

Провайдеры и службы схожи, и вы можете использовать их. Основная проблема здесь заключается не в услугах провайдера, а в обслуживании, но при обработке асинхронного характера вызова. То, что предложил @Ajay, будет работать как шарм. Вы можете посмотреть на этот вопрос SO для различий http://stackoverflow.com/questions/15666048/angular-js-service-vs-provide-vs-factory – Chandermani

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