如果尚未加载数据,则在每个 angular 控制器中调用一个 API

Call an API in every angular controller if data not yet loaded

我正在使用 angular 和 .net 后端构建单页应用程序。 除了控制器调用的单个 restful 资源外,我还有一个系统资源,它为应用程序提供系统范围的信息,我的大多数控制器都是 used/needed。 我在用户第一次登录的时候调用系统服务,把数据存到rootScope中。

但是,如果由于某种原因用户刷新页面将丢失 rootScope,那么系统数据将丢失并且控制器不再可用。

如果发生页面重新加载,我已经设法让系统服务触发,但问题是在许多情况下,来自控制器的服务 运行 在系统服务调用之前发生,这意味着数据是控制器运行时并不总是可用。

在 angular 中处理此问题的正确方法是什么?有没有办法让我的控制器依赖于某个 rootScope 状态,如果有必要,这会导致我的系统服务 API 在控制器发出自己的服务调用之前被调用?

谢谢

一种方法是创建一个 factory/service ,它被注入到每个需要此信息的控制器中并被调用。这样你就不必搞乱 $rootScope.

应该缓存获取信息的请求,这样您就不必在每次切换控制器时都触发获取。如果您想在页面刷新后保留信息,您可以使用 localstorage 来存储您的数据。

示例工厂:

angular.module('appName')
    .factory('Settings', ['$http', function ($http) {
        function getData() {
            var url = 'url/to/endpoint';
            return $http.get(url, {cache: true});
        }
        return {
            promise: getData()
        };
    }]);

通过从工厂返回承诺,我们确保 getData() 调用仅 运行 一次。虽然在这个特定实例中它几乎没有什么区别(因为它已经返回了一个内在的承诺),但它是最佳实践要遵循的模式。

此模式还意味着 getData() 在首次使用时被调用,而不管消费控制器是否访问承诺。这允许在某些用例中无需使用承诺即可轻松公开数据(数据绑定)。

在控制器中使用:

angular.module('appName')
    .controller('VeryNiceCtrl', ['$scope','Settings', function ($scope, Settings) {
        Settings.promise.success(function(response){
            var appSettings = response;
            // do stuff
        })
}])