2016-01-06 71 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

相关问题