2014-09-02 2 views
3

서비스를 사용하는 컨트롤러에서 볼 수있는 하나의 함수가있는 각도 서비스가 있습니다. 즉. getDataAngularJS 서비스에서 개인용 헬퍼 함수 정의

내 서비스가 서비스에 반환하기 전에 데이터를 조작하는 서비스에서 modifyData라는 헬퍼 함수를 ​​사용하여 데이터를 컨트롤러에 전송할 수있게하려고합니다. 서비스 외부에서 도우미 기능을 사용하거나 서비스 외부에서 도우미 기능을 사용하고 싶지 않습니다.

내 오류는 각도입니다. 오류 : modifyData는 정의되지 않았습니다.

내가 뭘 잘못하고 있니?

편집 : 예제 코드가 작동해야하므로 실제 코드는 다음과 같습니다. 너무 단순화했을 수 있습니다.

rabApp.service("reviewService", 
      ["$http", "$q", "beerService", "userService", 
      function($http, $q, beerService, userService) { 

/* HELPER FUNCTIONS */ 
/* Builds a complete review object from a user object, beer object, and partial review object */ 
var buildReviewObj = function(reviewObj, switchClass) { 
    var deferred = $q.defer(); 

    if(switchClass) { 
     reviewObj.dirClass = "left"; 
    } else { 
     reviewObj.dirClass = "right"; 
    } 

    //Make sure the review picture is valid and if not use default one 
    if(reviewObj.image.length <= 0) { 
     reviewObj.image = "images/default-beer-pic.jpg"; 
    } 

    //Make sure the review style is present if not put a default in 
    if(reviewObj.style.length <= 0) { 
     reviewObj.style = "Unknown"; 
    } 

    //Add user data 
    userService.getUser(reviewObj.author_id).success(function(data, status) { 
     //Check if we have a matched user 
     if(data.status === "success") { 
      var userObj = data.data; 

      //Make sure the profile picture is valid and if not use default one 
      if(userObj.profile_pic.length <= 0) { 
       userObj.profile_pic = "images/default-profile-pic.jpg"; 
      } 

      reviewObj.author = userObj; 
     } else { 
      deferred.reject("Bad User object returned"); 
     } 
    }); 

    //Add beer data 
    beerService.getBeer(reviewObj.beer_id).success(function(data, status) { 
     //Check if we have a matched beer 
     if(data.status === "success") { 
      var beerObj = data.data; 
      reviewObj.beer = beerObj; 
     } else { 
      deferred.reject("Bad Beer object returned"); 
     } 
    }); 
    deferred.resolve(reviewObj); 
} 

/* Gets an array of review objects from the backend 
* @return Array of Review objects 
*/ 
this.getReviews = function() { 
    var deferred = $q.defer(); 
    $http({ 
     method: "GET", 
     url: "/includes/services/reviews.php", 
     params: { a : "getReviews", 
        limit : "10" } 
    }).success(function(data, status) { 
     //switchClass variable alternates the review to display left or right 
     var switchClass = true; 

     //Notify review controller that we are loading reviews 
     deferred.notify("loading"); 

     //Check if we have reviews 
     if(data.status === "success") { 
      var reviews = []; 
      //Add beer and user data to each review 
      data.data.forEach(function(reviewObj, index) { 
       buildReviewObj(reviewObj, switchClass).then(function(data) { 
        switchClass = !switchClass; 
        reviews.push(reviewObj); 
       }); 
      }); 
      //Notify review controller that we are done 
      deferred.notify("finished"); 
      //Review array built successfully return reviews 
      deferred.resolve(reviews); 
     } else { 
      //Couldn't get reviews return false 
      deferred.reject("Couldn't access reviews.php back end service"); 
     } 
    }).error(function() { 
     //Couldn't get reviews return false 
     deferred.reject("Couldn't access reviews.php back end service"); 
    }); 
    return deferred.promise; 
}}]); 
+1

정상적으로 작동합니다. 데모에서 복제 할 수 있습니까 – PSL

+0

예제 코드를 단순화 할 때 오류가 수정되었을 수 있으므로 실제 코드를 추가했습니다. –

+0

buildReviewObj의 실제 반환 값에는 설정이 100 % 올바르게 설정되지 않아서 문제가있을 수 있습니다. 그러나 실행할 함수를 얻을 수 있다면이를 수정할 수 있습니다. –

답변

2

나는 이것이 내가 시간 동안 고생 한 후 여기 만 게시 후 해결하기 위해 나에게 10 분 걸렸다 마른 세수 내가

도우미 기능에서
return deferred.promise; 

누락 된 내 오류를 .... 발견 여기에 게시하기 전에 반.

+0

nice! 때로는 문제를 설명해야 할 때 솔루션을 찾는 것이 더 쉽습니다.) – Josep

+0

네, 너무 사실입니다, 내가 웹 dev에서 잘 배웠습니다. 학교에서 그러나 실제로 잊는 것 같습니다. –

+0

자신의 대답을 '수락'으로 표시해야합니다! – Brendan

관련 문제