2014-03-04 56 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

Angular.factory是一个单例,所以它总是只运行一次。此外,$http调用是异步的,因此您应该使用promise以便将数据传送到控制器。请尝试以下操作:

.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; 
    }; 
}); 

,并在你的控制器:

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

由于$http返回一个承诺,你可以进一步只需将.factory做:

.factory('Customers', function($http){ 
    return function() { 
     return $http.get('/api/customer'); 
    }; 
}) 

有关更多详细信息,请参阅documentation for $http

+0

该函数可以简化为'return $ http.get('/ api/customer');'。另外,这个问题似乎要模拟“promise unwrapping”,即立即返回一个稍后充满数据的对象。 (另一种选择是继续返回示例,然后在'$ route'配置中解析它。) – Mikke

+1

非常感谢,解决了这个问题。我必须阅读承诺,我还没有使用它们。似乎有理由返回数据承诺,直到数据可用。再次感谢! –

相关问题