2017-04-19 37 views
0

學習和測試AngularJS有點困難,我對如何構建服務以使某些數據可用於某些控制器存在懷疑。如何在AngularJS中構建服務以提供數據

我有一個JSON文件,我想從我的服務中加載它,然後通過我的控制器使用此服務來訪問數據。

我現在的服務是這樣的:

dashboardController.factory ('peopleRepository', function($http) { 
return { 
    getAllPeople: function() { 
     return $http.get("people.json"); 
    } 
} 
}); 

容易和簡單。 然後在我的控制,我做這樣的事情:

dashboardController.controller ('genderCtrl', function ($scope, $rootScope, peopleRepository) { 
    $scope.males = 0; 
    $scope.females = 0; 

    $scope.people = peopleRepository.getAllPeople().success(function(users) { 
    console.log ("SUCCESS -< ", users); 
    }); 

}); 

...當然一切的它的罰款和作品。 但我很確定這不是正確的做法。我需要在幾個控制器中訪問這些數據,這意味着基本上文件將被反覆加載,並且每次我都在等待成功事件加載內容。不是很優雅。 任何建議/提示新手?

+0

你可以組織你的應用是SPA'單頁app'(它允許你在第一負載後使用緩存的服務)。但是,如果您已將應用程序分隔到不同的控制器上,則需要在需要時進行注入。 (我忘了,但你也可以將服務緩存到你的應用程序中) 你是如何構建應用程序的其餘部分的? –

回答

3

創建一個cache對象來將數據存儲在服務中。第一個控制器將獲取的數據保存到它。另一個請求數據不會再次調用$ http,而是從緩存對象中獲取。我想你也不得不使用例如$ q來創建承諾基礎函數來獲取您的數據。

此外,您可以使用$ http angularjs服務中的內置緩存。有關更多信息,請參見How to cache an http get service in angularjs

+0

你的方法聽起來很有邏輯,是不是@Nowres在他的回答中提出的解決方案? –

+0

是的。我還建議在'then'中使用第二個回調函數,如果.get不成功,它將被執行:) –

2

您必須至少添加一個簡單的緩存機制。

這裏有一個簡單的例子:

dashboardController.factory ('peopleRepository', function($http, $q) { 
    var people; 

    return { 
     getAllPeople: function() { 
      if (!people) { 
       // endpoint value may be put in a constant 
       people = $http.get("people.json").then(function (result) { 
        return result; 
       }); 
       // A generic error handling mechanism can also be used 
      } 
      return people; 
     } 
    } 
}); 
+0

在加載完成之前,你的解決方案不會返回一個空的Object嗎? –

+0

它將永遠回報一個承諾 –

相關問題