2016-01-06 5 views
0

У меня есть страница, где мне нужно нажать 2 успокоительных вызова веб-службы. 1-й вызов отдыха выполняется успешно, и я возвращаю данные. После удара 2-й службы все данные 1-го вызова сохраняются в переменной. Таким образом, использование метода обратного вызова является решением для этого? Если да, то как написать метод обратного вызова способом angularjs?Запись функции обратного вызова в угловой js

Вот мой код.

app.directive('collection', function() { 
    return { 
     restrict: "E", 
     replace: true, 
     scope: { 
      collection: '=', 
      articleData: '=', 
      articleContent: '=' 
     }, 
     template: "<ul><member ng-repeat='member in collection' member='member' article-data='articleData' article-content='articleContent'></member></ul>" 
    } 
}); 

app.directive('member', function($compile,$http,getTocService) { 
    return { 
     restrict: "A", 
     replace: true, 
     scope: { 
      member: '=', 
      articleData: '=', 
      articleContent: '=' 
     }, 
     template: "<div><li><a href='#' ng-click='getContent(member.itemId)'>{{member.title}}</a></li></div>", 
     link: function(scope, element, attrs) { 
      scope.getContent = function(itemId) { 
        var art = getTocService.getArtData(itemId); 
      } 

      if (angular.isArray(scope.member.tocItem)) { 
       if (scope.member.hasChildren == "true") { 
        for (var i = 0; i < scope.member.tocItem.length; i++) { 
         if (scope.member.tocItem.title) { 
          scope.member.tocItem.title.hide = true; 
         } 
        } 
       } 
       element.append("<collection collection='member.tocItem'></collection>");  
       $compile(element.contents())(scope) 
      } 
     } 
    } 
}); 


app.controller('apdController', function($scope, getTocService,$location) { 
    var bookId = $location.search().id; 
    var sampdata = getTocService.getToc(bookId); 
    $scope.tasks =sampdata; 
// $scope.tasks = data; 

// var artData = getTocService.getArtData('PH1234'); 
// $scope.articleContent = artData; 
}); 

app.service(
     "getTocService", 
     function($http, $q) { 
      return({ 
       getToc: getToc, 
       getArtData: getArtData 
      }); 

      function getToc(bookIdvar) { 
       var request = $http({ 
        method: "post", 
        url: "http://10.132.241.41:8082/apdpoc/services/ApdBookService/getTOC", 
        params: { 
         action: "post" 
        }, 
        data: { 
         getTOCCriteria:{ 
         bookId: bookIdvar 
         } 
        } 
       }); 
       return(request.then(handleSuccess,handleError)); 
      } 

      function getArtData(itemId) { 
       var request = $http({ 
        method: "post", 
        url: "http://10.132.241.41:8082/apdpoc/services/ApdBookService/getArticle", 
        params: { 
         action: "post" 
        }, 
        data: { 
         getArticleCriteria:{ 
         articleId: itemId, 
         locale: "en_US" 
         } 
        } 
       }); 
       alert(data); 
       return(request.then(handleSuccess,handleError)); 
      } 
      function handleSuccess(response){ 
       return (response.data); 
      } 

      function handleError(response) { 

       if (
        ! angular.isObject(response.data) || 
        ! response.data.message 
        ) { 
        return($q.reject("An unknown error occurred.")); 
       } 
       return($q.reject(response.data.message)); 
      } 

     } 
); 

Здесь «данные» - это переменная, которую я использую в обоих вызовах для хранения данных ответа. И я звоню 2-й сервис «getArtData» от

var art = getTocService.getArtData(itemId); 
+0

Вы, вероятно, следует перенести этот вопрос к [Просмотр Кода] (http://codereview.stackexchange.com/questions/tagged/angular.js), потому что ваш код имеет больше проблем, чем просто СЦЕПЛЕНИЕ обещания. – georgeawg

ответ

1

Вы должны серьезно рассмотреть вопрос об использовании обещаний. Обещания позволяют цепочки и намного лучше, чем обратный ад. Ключевое слово здесь используется , затем.

Этот SO пост объясняет это лучше: Processing $http response in service

Надеется, что это полезно для вас.

1

Ваш getTocService возвращает обещания, и вам нужно цепь два обещания.

var bookId = $location.search().id; 
var sampdataPromise = getTocService.getToc(bookId); 

sampdataPromise.then(function(data) { 
    $scope.tasks = data; 
    //return next promise for chaining 
    return getTocService.getArtData(data.itemId); 
}).then (function (artData) { 
    $scope.articleContent = artData; 
}).catch (function (error) { 
    //log error 
}); 
+0

Даже сейчас старые идентификаторы данных сохраняются после удара второй службы обслуживания, то есть после получения getArtData() также имеются данные getToc(). – Sanjay

+0

Мне нужно увидеть код, который вы используете для ** цепочки **. Также используйте ** заводского поставщика ** вместо ** поставщика услуг ** для провайдера 'getTocService'. – georgeawg

+0

Я довольно новый для углового. Поэтому я не очень хорошо знаю производителя завода. Я попробую сделать это. Спасибо. – Sanjay

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