Angularjs将ajax数据缓存到服务中
我有这样一个简单的场景 应用程序从主视图(/Main)启动,然后单击右上角按钮进入子视图(/Sub) 在应用程序启动期间,Angularjs将ajax数据缓存到服务中,ajax,angularjs,angularjs-service,Ajax,Angularjs,Angularjs Service,我有这样一个简单的场景 应用程序从主视图(/Main)启动,然后单击右上角按钮进入子视图(/Sub) 在应用程序启动期间,app.run(),用户的配置文件将加载到服务userService,一旦用户转到子视图,该配置文件将从该服务userService读取,然后显示,代码如下 app.run(function($http, $rootScope, userService){ $http.get('/profile').then(function(result){ use
app.run()
,用户的配置文件将加载到服务userService
,一旦用户转到子视图,该配置文件将从该服务userService
读取,然后显示,代码如下
app.run(function($http, $rootScope, userService){
$http.get('/profile').then(function(result){
userService.setProfile(result.data.profile);
});
});
app.service('userService', function(){
var user = {}
this.setProfile(profile){
user.profile = profile;
};
this.getProfile(){
return user.profile;
}
});
在子视图中,调用了getProfile()
来显示信息
如果用户从主视图->按钮->子视图开始,它可以工作,但是,如果用户手动刷新子视图或仅从子视图开始,getProfile()
将不会显示任何内容,我知道这是因为在返回配置文件的承诺之前,子视图已经开始了
我不喜欢直接和动态地从子视图中读取配置文件,因为我有其他页面也需要配置文件信息,所以是否有任何解决方法或更好的设计?谢谢。我的工作方法是将相关数据添加到$window.sessionStorage,大致如下(您需要使$window可用):
为此,您可能应该使用路由提供商,而不是使用app.run。无论您使用ngRoute还是ui路由器,它们都具有解析功能。不要在app.run中获取您的个人资料,您可能还应该将其移动到userService
app.service('userService', function(){
var self = this;
self.user = {};
self.getProfile = function() {
return self.user.profile;
};
self.init = function() {
return $http.get('/profile').then(function(result){
self.user.profile = result.data.profile;
});
};
});
现在您的服务更像工厂,您可以在路由提供程序中利用它的初始化。我使用ui路由器,但这也可以很容易地应用于ngRoute
我首先创建一个抽象状态来处理解析,而不是在我需要的任何其他状态中“导入”
.state('init', {
abstract: true,
resolve: ['userService', function(userService) {
return userService.init();
}]
});
现在我只在其他状态下使用它,我可以保证userService已经初始化
.state('subView', {
parent: 'init',
url: '/subView'
//other state stuff like template, controller, etc
});
您可以在加载子视图之前解析配置文件:run不会等待请求完成。。。如前所述,在路由器中使用resolve
。若使用ui路由器和父级路由器,问题其实很简单states@BroiSates@charlietfl我觉得resolve
没有那么方便,我必须配置每个路由器,将配置文件注入其控制器,这就是为什么使用ui路由器和父状态非常有用,您在父级上只有一个解析level@charlietfl预加载初始化数据然后手动角度引导,在应用程序运行中设置这个userService
是一个很好的做法吗?这会解决问题,但是,profile将成为一个“公共”变量,你甚至可以从userService
外部修改,这还不够好。是的,事实上,我根据评论改变了类似的方式,现在我想先预加载init数据,然后手动角度引导,在应用程序运行中,我将设置这个用户服务
,您对此有何看法,哪一个更好?我想这只是完成同一件事的两种方式。我不是一个有棱角的大师,所以我真的不能说哪一个更好,因为对我来说,这两个都是引导数据的好方法。在app.run中加载它是一种方法,在使用router方法时需要将它包含在每个路由中,这样可以为您节省一些代码,但是我喜欢选择需要它的路由的能力。
.state('subView', {
parent: 'init',
url: '/subView'
//other state stuff like template, controller, etc
});