我应该使用$ rootScope来存储只需要进行一次的http请求

时间:2013-01-10 12:51:25

标签: javascript angularjs

我正在使用AngularJs作为新应用程序。我觉得我已经解决了一个问题,但我不确定我是否已经以最好的方式做到了,所以我想在开枪之前检查一下。

让我们举例说明我有两个控制器AccountsCtrl和ContactsCtrl,每次调用一个请求到REST服务器的所有帐户或联系人分别为每个控制器。在控制器内,任何数据更改都会在角度模型(和服务器后端)中保持同步,以反映这一点,从而反映UI。每次用户在每个控制器之间切换时,他们必须调用服务器来获取上次加载时已经拥有的数据(这是最新的)。

目前这导致非常小的延迟。我想使它持久,即每次加载控制器时都不加载以节省滞后和服务器请求。我已经尝试将数据保存到$ rootScope中,这很有效,但我不确定这是正确的做法吗?

问题是如何最好地解决这个问题? $ rootScope是解决这个问题的最佳方法吗?

2 个答案:

答案 0 :(得分:2)

我会在一个或两个Angular服务中存储与Web服务器交互的数据和代码。每次创建控制器时(例如,当您第二次返回页面时),(适当的)服务应决定是返回缓存的数据还是向REST服务器发出Ajax请求。

您的服务将被注入您的控制器。

另请参阅https://stackoverflow.com/a/12009408/215945https://groups.google.com/d/topic/angular/eegk_lB6kVs/discussion

答案 1 :(得分:0)

首先,您应该通过服务进行REST调用:

app.factory('RestService', ['$http', function($http) {
   return {
     getSomething: function(url) {
        var result = {};

        $http.jsonp(url).success(function(data) {
           result.list = data;
        });
        return result;
     }
   };
   ...
}];

您不需要$rootScope。只需定义一个父控制器,它可以控制两个控制器,例如RootController,并将数据存储在那里。这是因为子范围(例如来自AccountsCtrl)继承了父范围中定义的内容。

<div ng-controller="RootController">
    <div ng-controller="AccountsCtrl">
    </div>
    <div ng-controller="ContactsCtrl">
    </div>
</div>

在实践中,这几乎与使用$rootScope相同,但您不需要注入它,并且您的控制器逻辑与其他控制器类似。