我已经阅读了多个地方,您可以通过服务/提供商/工厂跨控制器共享数据。也许我错误地解释了这些结果,但是根据我的理解,服务/提供者/工厂是一个抽象,可以在提供相同数据的控制器之间重新运行。
我希望从数据库查询中获得一次结果,而不是在不同的控制器上再次发出相同的请求。服务/提供商/工厂是这样做还是我需要像ngStorage或localStorage这样的东西?还是有另一种我没想到的方式?我看到提到在启动时进行初始查询(.run?)但是我不确定是否已开始使用它。
答案 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;
答案 1 :(得分:1)
这取决于。如果您正在寻找每个应用程序会话仅加载一次数据的方式(例如,在应用程序引导程序和窗口重新加载/关闭/导航到外部)服务将成为您的解决方案。但是,如果您正在寻找能够在会话之间存储数据的解决方案,则需要依赖服务中的某些浏览器存储解决方案。