我正在使用AngularJs作为新应用程序。我觉得我已经解决了一个问题,但我不确定我是否已经以最好的方式做到了,所以我想在开枪之前检查一下。
让我们举例说明我有两个控制器AccountsCtrl和ContactsCtrl,每次调用一个请求到REST服务器的所有帐户或联系人分别为每个控制器。在控制器内,任何数据更改都会在角度模型(和服务器后端)中保持同步,以反映这一点,从而反映UI。每次用户在每个控制器之间切换时,他们必须调用服务器来获取上次加载时已经拥有的数据(这是最新的)。
目前这导致非常小的延迟。我想使它持久,即每次加载控制器时都不加载以节省滞后和服务器请求。我已经尝试将数据保存到$ rootScope中,这很有效,但我不确定这是正确的做法吗?
问题是如何最好地解决这个问题? $ rootScope是解决这个问题的最佳方法吗?
答案 0 :(得分:2)
我会在一个或两个Angular服务中存储与Web服务器交互的数据和代码。每次创建控制器时(例如,当您第二次返回页面时),(适当的)服务应决定是返回缓存的数据还是向REST服务器发出Ajax请求。
您的服务将被注入您的控制器。
另请参阅https://stackoverflow.com/a/12009408/215945和https://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
相同,但您不需要注入它,并且您的控制器逻辑与其他控制器类似。