2014-01-03 2 views
2

다른 서비스에서 오는 서비스에 대한 약속이 있습니다. 데이터에 직접 액세스하려고합니다. 내 서비스의AngularJS 다른 서비스에서 약속에 액세스하는 방법

이있다 (작은 부분) :

factory('CalculationFactory', function(SizeFromPipe){ 
    var input = { 
     sizes: function(pipe_id){ 
     var sizesFromPipes = SizeFromPipe.getSizes(pipe_id); 
     sizesFromPipes.then(function(val){ 
      console.log(val); //Is an object 
      return val; 
     }); 
    } 
    return input; 
    }). 

이 내 "DataService에"입니다 :

:

factory('SizeFromPipe', function($resource, $q){ 
    return { 
     getSizes: function(pipe_id){ 
     var deffered = $q.defer(); 
     $resource('/api/sizes/fromPipe/:id', {'id':'@id'}) 
      .query({id:pipe_id}, 
      function(sizes){ 
      deffered.resolve(sizes); 
      }, 
      function(response){ 
      deffered.reject(response); 
      }); 

     return deffered.promise; 
     } 
    }; 
    }) 

내가 내 컨트롤러에서이 작업을 수행하고 싶습니다

$scope.sizes = CalculationFactory.sizes(pipe_id) 

그래도 나는 정의되지 않습니다.

아이디어가 있으십니까?

업데이트 : 데이터 서비스가 추가되었습니다. 나는 컨트롤러에서 이걸로 접근 할 수 있다는 것을 안다. 나는 내 컨트롤러를 깨끗하게 유지하고 싶다. 대신 내 모델에서이 문제를 처리 할 수 ​​있다면 대단 할 것이다.

+1

resolve: { anyname: function($route, Pipe) { Pipe.query($route.current.params, function(data) { $route.current.scope.some_variable = data; }); } } 

는 공장'의 마지막 과정 ('CalculationFactory''? –

+0

예. 고정 그것. 들으 – Per

+0

가 확실 CalculationFactory.input.sizes'점이다에서 아무것도 반환했다 (pipe_id)'가 작동하는 것 같아요. 'CalculationFactory.sizes (pipe_id)'여야합니다. –

답변

0

를 반환 할 수 있으며, $route.current.scope를 통해 범위 변수에 액세스 할 수있는 방법을 찾을 것입니다. 그래서 바로 거기에 배정하십시오. 및 라우트가 자동으로 서버에서 응답을 가져 오는 경우 컨트롤러에 코드가 없습니다. 자원

something.factory("Pipe", function($resource) { 
    return $resource('/api/sizes/fromPipe/:id'); 
}) 
0

경고 : 이것은 모두 테스트되지 않았으므로 최선의 해결책이라고 확신합니다. 방탄을 원하는 사람이라면 전문가를 기다려라.

옳은 일을하고 싶지만 여전히 비 동시성에 속고 있습니다.

아마 같은 :

factory('CalculationFactory', function(PipeCalculation, SizeFromPipe){ 
    var input = { 
     sizes: function(pipe_id){ 
     return SizeFromPipe.getSizes(pipe_id);    
     }); 
    }, 
    }). 

// in controller 
CalculationFactory.input.sizes(pipe_id).then(function(promise){ 
    $scope.sizes = promise; 
}) 

이 ... 도움이 될 것입니다.

그러나이를 수행하는 데는 많은 방법이 있습니다. PipeCalculation 코드를 보는 데 도움이 될 수 있습니다. 어쩌면 당신은 지나친 생각이나 지나치게 복잡하게 된 것일 수 있습니다.

또 다른 방법은 제가 개인적으로 $routeProvider의 결의를 사용하는 대신 청소 자원 팩토리를 유지하고 새로운 약속을

factory('CalculationFactory', function(PipeCalculation, SizeFromPipe){ 
    var input = { 
     sizes: function(pipe_id){ 

      // Assume that $q is available 
      var defer = $q.defer(); 

      SizeFromPipe.getSizes(pipe_id).then(function(promise){ 
      defer.resolve(promise); 
      }) 

      return defer.promise;   
     }); 
    }, 
    }). 
관련 문제