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

非常感謝,解決了這個問題。我必須閱讀承諾,我還沒有使用它們。似乎有理由返回數據承諾,直到數據可用。再次感謝! –

相關問題