2014-03-04 5 views
2

다음 고객이 고객을 돌려주는 서비스를 사용하는 컨트롤러가 있습니다. 문제는 컨트롤러가 처음 실행될 때만 서비스가 실행된다는 것입니다. 내 서버를 볼 때 나는보기를 변경하고 고객을 추가하고 다른 고객이 없기 때문에 고객이 업데이트하지 않은보기로 되돌아 오는 경우 컨트롤러가 사용한 첫 번째 요청 (보기를로드하는 중) 만 볼 수 있습니다. 서비스 요청.처음 컨트롤러를 사용하는 경우에만 AngularJS 서비스가 사용됩니다.

.controller('searchCTRL', ['$scope', '$http', 'Customers', function($scope, $http, Customers) { 
     $scope.customers = Customers; 
     $scope.deleteCustomer = function(id) { 
      $http.delete('/api/customer/' + id) 
       .success(function(data) { 
        $scope.customers.data = data; 
       }) 
       .error(function(data) { 
        console.log('Error: ' + data); 
       }); 
     }; 
    }]) 

내가보기에 유지하고 데이터가해야하지만 페이지에 후속 방문이 더 이상 가져 오기를 실행 등을 가져옵니다 페이지를 다시로드하면
.factory('Customers', function($http){ 
    var Customers = {}; 
    $http.get('/api/customer') 
     .success(function(data) { 
      Customers.data = data; 
     }) 
     .error(function(data){ 
      console.log('error: ' + data); 
     }); 
    return Customers; 
}); 

. 어떤 도움을 주시면 감사하겠습니다.

답변

8

각도 .factory는 싱글 톤이므로 항상 한 번만 실행됩니다. 또한 $http 호출은 비동기이므로 컨트롤러에 데이터를 가져 오려면 promise을 사용해야합니다. 당신은 단순히 당신의 .factory 수행하여 더, 수 $http으로

.controller('searchCTRL', ['$scope', '$http', 'Customers', function($scope, $http, Customers) { 
    Customers().then(function (data) { 
     $scope.customers = data; 
    }); 
... 

이 약속을 반환합니다 :

.factory('Customers', function($http, $q){ 
    return function() { 
     var d = $q.defer(); 
     $http.get('/api/customer') 
      .success(function(data) { 
       d.resolve(data); 
      }) 
      .error(function(data){ 
       console.log('error: ' + data); 
       d.reject(data); 
      }); 
     return d.promise; 
    }; 
}); 

및 컨트롤러에 다음 시도

더 자세히 들어
.factory('Customers', function($http){ 
    return function() { 
     return $http.get('/api/customer'); 
    }; 
}) 

참조 documentation for $http.

+0

이 함수는 간단히'$ http.get ('/ api/customer'); return'로 단축 될 수 있습니다. 또한 질문은 "unwrapping 약속"을 시뮬레이션하려는 것, 즉 나중에 데이터로 채워지는 객체를 즉시 반환하려는 것 같습니다. (또 다른 옵션은 예를 보여 주겠다는 약속을 지키고'$ route' 설정으로 해결하는 것입니다.) – Mikke

+1

고맙습니다. 문제가 해결되었습니다. 나는 약속을 읽을 필요가있다. 나는 아직 사용하지 않았다. 데이터가 사용 가능할 때까지 데이터 약속을 반환하는 것이 합리적입니다. 다시 한 번 감사드립니다! –

관련 문제