2015-08-26 3 views
1

Я новичок в AngularJS не глупый, LOL. У меня был этот звонок в контроллере, я хотел переместить его в службу. Мне нужно сделать его доступным для нескольких контроллеров.

$http.post("/admin/Leads/LoadLeads.ashx", dataObj) 
    .success(function (response) { 
     $scope.Leads = response.p; 
    }); 

Вот что я пробовал. Возврат ответа не может назначить данные таким же образом.

Услуги:

myLeadDashboard.factory('LeadsServiceTest',[function(){ 
      return { 
       retrievePostData: function($http,dataObj){ 
        return $http.post("/admin/Leads/LoadLeads.ashx", dataObj); 
        } 
      } 
     }]); 

Контроллер:

var LeadsPromise = LeadsServiceTest.retrievePostData($http,dataObj); 
      LeadsPromise.then(function(data) { 
       $scope.Leads = data.p; 
      }); 

Что я делаю неправильно? Что я не понимаю? Если вам нужна дополнительная информация о том, что я делаю, дайте мне знать. Спасибо.

ответ

1

HttpPromise.sucess распространяет объект ответа так, чтобы первым параметром были данные ... $ q.then дает вам исходный объект ответа. Вы можете получить доступ к данным из контроллера со следующим:

var LeadsPromise = LeadsServiceTest.retrievePostData($http,dataObj); 
LeadsPromise.then(function(response) { 
    $scope.Leads = response.data.p; 
}); 
+2

Хорошо тоже привыкнуть к этому сейчас. '$ http' устарел для обработчиков успеха/ошибок: https://docs.angularjs.org/api/ng/service/$http#deprecation-notice – DRobinson

+0

Так что $ q наследует $ http? Как это выглядело бы из стандартов ООП? –

+0

Функции $ http возвращают пользовательское обещание $ q, которое обеспечивает дополнительные функции успеха/ошибки ... поскольку они обесценивают их, вы должны придерживаться результата $ http calls в качестве стандартного обещания $ q. Если вы хотите, чтобы ваша служебная функция возвращала фактические данные, вы могли бы использовать цепочку обещаний: 'return $ http.post (...). Then (function (response) {return response.data;});' –

1

Вот как я хотел бы использовать угловые услуги -

.service('mySpecialService', [ 
     '$q', 
     'Restangular', 
     function MyService($q, Restangular) { 


      MyService.prototype.list = function() { 
       return $q(function(resolve, reject) { 
        //make list call 
       }); 
      }; 

      MyService.prototype.post = function(data) { 
       return $q(function(resolve, reject) { 
        //make post call 
       }); 
      }; 

      MyService.prototype.delete = function(id) { 

       return $q(function(resolve, reject) { 
        //delete by id 
       }); 
      }; 

      MyService.prototype.list = function list() { 

       return $q(function(resolve, reject) { 
        //make list call 
       }); 
      }; 

Так что я хотел бы использовать $q, а вместо $http также restangular - но $http прекрасно, если вам нравится это. Затем вы вводите службу, где бы вы ни хотели ее использовать, и назовите ее!

Так как - в контроллере, где вы должны его вводили это может быть как

MyService.post(postData); 

и потому, что я использую $q у вас есть варианты использования обещания как

MyService.post(postData) 
     .then(function(data){ 
     //call complete logic 
     }) 
     .catch(function(err){ 
      console.log("error in post ", err); 
     }); 

Просто примечание - если вы не используете $q, у вас будет слой .data.

+0

Является единственной целью обработки ошибок в $ Q где предлагается? Мой API обрабатывает большую часть этого. К моменту, когда он попадает в мой внешний код, он просто нужно отображать в соответствующих местах. И вывести вызовы обратно в мой API для надлежащего обновления базы данных. Угловой кажется отличным способом сделать это. Однако кривая обучения - небольшой вес. –

+0

@ kcbeard не чисто нет, это библиотека обещаний, которая просто поймает, если что-нибудь случится с ошибками. – ajmajmajma

0

Когда вы объявляете вашу службу, вы должны поставить $ HTTP службы в качестве параметра вашей сервисной функции. Затем, $ http сервисное обещание.

При использовании .then(), он возвращает обещание в то время как .success() более традиционный способ регистрации обратных вызовов и не возвращает обещание.

PS: Хорошие советы - обернуть объявления/контроллеры/etc .. в анонимную функцию.

Вы можете сделать следующее:

контроллер

(function(){ 

function Controller($scope, Service) { 

    //Retrieve our promise 
    var promise = Service.post([1,2,3]); 

    promise.then(function(response){ 
    //Retrieve our data 
    console.log(response.data); 
    }); 

    promise.success(function(data){ 
    //Data is what i want, it is not raw data 
    console.log(data) 
    }); 

} 

angular 
.module('app', []) 
.controller('ctrl', Controller); 

})(); 

Service

(function(){ 

    function Service($http){ 


    function post(data){ 
     //Return promise 
     return $http.post('path_to_url', data); 
    } 

    var factory = { 
     post: post 
    }; 

    return factory; 

    } 

    angular 
    .module('app') 
    .factory('Service', Service); 

})(); 
Смежные вопросы