2014-07-13 3 views
3

나는 내 컨트롤러에서 공장을 인스턴스화하는 것을 완전히 혼란스럽게 생각합니다. 내가하는 일과 상관없이 내 공장 ('FBRetrieve')은 정의되지 않은 것 같습니다. 그것은 아주 단순한 것이어야하지만 S/O search/google/angulardocs를 통해 해결책을 찾지 못합니다.각도 의존성 주입 - 공장/정의되지 않은 공장 초기화하지 말 것

var legalmvc = angular.module('legalmvc', ['ngRoute','FireBaseService']); 

angular.module("FireBaseService", []).factory('FBRetrieve', function(){ 
    var biblioData = new Object(); 


    biblioData.getData = function(type){ 
     var biblioRef = new Firebase('https://legalcitator.firebaseio.com/'+type); 

     biblioRef.on('value', function(data) { 
      if (data.val() === null) { 
       console.log("ERROR"); 
       return; 
      } 
      console.log(data.val()); 
      biblioData = data.val(); 


     }); 

     return biblioData; 

    }; 

}); 

을 factory.js 컨트롤러에서이 같은 뭔가 인스턴스화하고있어 app.js :

legalmvc.controller('FormCtrl',["$scope","FBRetrieve", function ($scope, FBRetrieve) { 

    $scope.FBRetrieve = FBRetrieve.getData('case'); 

..... 

답변

3

getData 비동기 작업, 그것은이다 응답을 반환하려고 할 때 아직 응답을 사용할 수 없음을 의미합니다.

biblioData.getData = function(type) { 

    var biblioRef = new Firebase('https://legalcitator.firebaseio.com/'+type), 
     deferred = $q.defer(); // remember to inject $q service into factory 

    biblioRef.on('value', function(data) { 
     if (data.val() === null) { 
      deferred.reject('ERROR'); 
     } 
     deferred.resolve(data.val()); 
    }); 

    return deferred.promise; 
}; 

그런 다음 당신이 컨트롤러를 사용합니다 :

FBRetrieve.getData('case').then(function(data) { 
    $scope.FBRetrieve = data; 
}, function() { 
    // handle error 
}); 

또한이 일반적인 problem and solution에 대한 자세한 내용 대신 (이 경우 자연) 연기 패턴의 콜백을 사용해야합니다.

+0

놀랍습니다. 감사. – zazou