我正在构建一个相当大的Angular应用程序,而且我一直坚持建设“瘦身”的设计。控制器。我的控制器不会尝试做太多,他们每个人都专注于我的应用程序中的一项功能。
然而,某些数据是“共享”的。控制器之间。我的目标是避免使用$rootScope
,而是依靠服务来共享数据和“状态”。
查看“网络”时Chrome开发者工具的标签我注意到某些服务被调用了六次。所以我的问题是,这是一个糟糕的设计吗?在Angular应用程序中多次调用同一服务而不是' Angular方式'做事吗?注意:这些服务调用每个需要大约20毫秒,所以到目前为止显然没有太大的性能影响。
答案 0 :(得分:1)
我建议减少您所做的不必要的HTTP请求数量,原因有两个:
在生产环境中,当考虑网络延迟或服务器负载等因素时,这些HTTP请求可能需要更长时间才能完成;以及
会延迟加载任何其他资源,例如图像(假设它们来自同一个域)。
我在处理您所描述的方案时使用的方法是缓存服务中API的响应/数据。因此,在后续调用服务时,可以从缓存而不是API中提取数据。
请参阅下面的简短示例:
angular.module('app', ['ngResource'])
.factory('Post', ['$resource', function($resource) {
var posts = [];
var service = {
all: all
}
return service;
function all() {
// if cached posts exist, return those. Otherwise, make call to external API.
if (posts.length > 0) {
return posts.$promise;
} else {
posts = $resource('http://localhost/api/v1/posts.json').query();
return posts.$promise;
}
}
}]);
注意:您还必须考虑重置缓存,但这取决于您的应用程序逻辑。
希望这有帮助!
L
答案 1 :(得分:0)
在这种情况下,您应该使用$cacheFactory来减少服务呼叫。
答案 2 :(得分:0)
您在谈论REST服务吗?您是否进行$ http调用以在控制器之间共享数据和状态?
为什么不在Angular中使用service/factory?
答案 3 :(得分:0)
你需要的是什么
1. DataCache服务/工厂 - 它将存储您的服务器响应
2.指令 - 调用这些服务。将它包含在您的不同视图中
3.现在在您的服务中负责进行http调用首先检查数据是否在缓存中是否可用如果是,则返回存储数据的承诺(如果不进行服务调用,则可以使用$ q.when)。
我已经提到过第2点,因为我在你的各种控制器中假设你必须做像AbcFactory.getItem()。then()这样的事情,以避免重复这段代码,因为你永远不知道什么时候需求会改变,因为改变是在开发期间仅保持不变;)