使用Angular 1.X如何在控制器之间保留$ http请求的结果?

时间:2016-10-19 00:16:52

标签: angularjs persistence

我已经阅读了多个地方,您可以通过服务/提供商/工厂跨控制器共享数据。也许我错误地解释了这些结果,但是根据我的理解,服务/提供者/工厂是一个抽象,可以在提供相同数据的控制器之间重新运行。

我希望从数据库查询中获得一次结果,而不是在不同的控制器上再次发出相同的请求。服务/提供商/工厂是这样做还是我需要像ngStorage或localStorage这样的东西?还是有另一种我没想到的方式?我看到提到在启动时进行初始查询(.run?)但是我不确定是否已开始使用它。

2 个答案:

答案 0 :(得分:2)

总结我上面的评论...

  

"我希望从数据库查询中获得一次结果,而不是在不同的控制器上再次发出相同的请求。服务/提供商/工厂是否这样做......"

是。 Angular中的提供者是单身人士,因此他们在不同的消费者(控制器等)中都是相同的实例。您可以在其中存储将在内存中的数据

只要您打开页面并且不会重新加载或导航,工厂就会持续工作,而本地存储之类的东西会持续超出此范围。

这是一个在app启动(即打开/重新加载页面)上进行HTTP查询的示例,可以在控制器和其他消费者之间共享



angular.module('so', [])

.factory('sharedData', function($http) {
  // this factory is a promise  
  return $http.get('https://jsonplaceholder.typicode.com/posts/1')
    .then(res => res.data);
})

.controller('someController', function(sharedData) {
  sharedData.then(post => {
    this.post = post;
  });
})

.controller('anotherController', function(sharedData) {
  sharedData.then(post => {
    this.post = post;
  });
});

<div ng-app="so">
  <dl ng-controller="someController as s">
    <dt>Post title</dt>
    <dd>{{s.post.title || 'Loading...'}}</dd>
    <dt>Post body</dt>
    <dd>{{s.post.body || 'Loading...'}}</dd>
  </dl>
  
  <pre ng-controller="anotherController as a">post = {{a.post|json}}</pre>
</div>

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

这取决于。如果您正在寻找每个应用程序会话仅加载一次数据的方式(例如,在应用程序引导程序和窗口重新加载/关闭/导航到外部)服务将成为您的解决方案。但是,如果您正在寻找能够在会话之间存储数据的解决方案,则需要依赖服务中的某些浏览器存储解决方案。