2016-01-06 72 views
0

我使用工廠在用戶登錄後獲取JSON數據。如果用戶名和密碼正確,它應該從api鏈接中提取JSON數據。我的應用程序中有幾個控制器需要使用這些數據。我想避免與我的所有控制器共享這個工廠,因爲我不想保留「獲取」數據。我只希望這個工廠和登錄控制器一起使用。保存其他控制器使用的'GET'請求的數據?

如何從'dummyData'保存數據,然後所有其他控制器都可以使用該數據,而不必每次都發出'GET'請求?

angular.module('ciscoImaDashboardApp').factory('dummyData', ['$q', '$http', function($q, $http) { 
    var apiServices = {}; 

    apiServices.saveData = function(user,password) { 
     var deferred = $q.defer(); 

     var req = $http({ 
      method: 'GET', 
      url: 'http://magainteractive.com/prototypes/cisco-ima-dashboard/cms/web/api/login/login/?username='+user+'&password='+password 
     }); 

     req.success(function(response) { 
      deferred.resolve(response); 
     }); 

     req.error(function(err) { 
      console.log("there was an error: "+err); 
      deferred.reject(err); 
     }); 

     return deferred.promise;  
    } 

    return apiServices; 

}]); 
+0

您可以使用[$ cacheFactory](https://docs.angularjs.org/api/ng/service/$cacheFactory)並在第一次調用後保存結果 –

+0

看看我在這篇文章中的回答: http://stackoverflow.com/questions/33968655/how-can-i-use-my-json-without-triggering-a-new-api-request-everytime-i-want-to-u/33969521#33969521 – sjokkogutten

+0

你可以使用['$ rootScope'](http://astutejs.blogspot.in/2015/07/angularjs-what-is-rootscope.html)嗎?一個例子[SO帖子](http://stackoverflow.com/questions/21444100/angularjs-how-to-http-get-data-and-store-it-in-service) –

回答

0

你必須創建一個服務(誰是單身),並要訪問登錄數據注入它的每一個。 上的第一個$ http.get()您在服務中寫入數據。並在其他控制器中讀取數據

1

在您的工廠中創建另一個值並存儲您獲取的數據。然後,您可以使用dummyData.user或類似的東西從任何控制器訪問該數據。

best practices,你可以做這樣的事情:

function userService() { 
    var service = { 
     user: null, 
     authenticateUser: authenticateUser 
    }; 

    return service; 

    function authenticateUser() { 
     // your GET logic here 

     // then set service.user to the successful response data 
    }; 
} 

所以任何你注入userService你可以做userService.user而無需進行第二次得到您會收到用戶的數據。它將基本上存儲在當前會話中。例如:

function dashboardController(userService) { 
    var vm = this; 
    vm.currentUser = userService.user; 
} 

注意事項

這種方法的問題是,如果用戶刷新,從服務的數據將會丟失。

您可以利用瀏覽器工具的強大功能 - 即本地存儲。因此,與其將service.user設置爲成功的響應數據,您可以執行類似localStorage.setItem('user', response.data)的操作,並且可以在整個控制器中以localStorage.getItem('user')的身份訪問該對象,該對象或任何您將其保存爲。這將允許它在瀏覽器中直到被刪除或過期,所以即使用戶刷新他當前的會話,用戶數據仍然會存在。這也只需要一個GET請求。

請參閱這些docs for some info on localStorage。適用於基本上所有現代瀏覽器,並且可以使用IE 8。

您也可以使用$cacheFactory作爲建議的註釋之一。

+0

謝謝!這工作! –

+0

沒問題。請記住關於警告,儘管..人們刷新屏幕很多,你不希望他們失去他們的用戶數據,並有一個破碎的應用程序。本地存儲或$ cacheFactory將是一個更好的方法。 – Lansana

相關問題