Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs将ajax数据缓存到服务中_Ajax_Angularjs_Angularjs Service - Fatal编程技术网

Angularjs将ajax数据缓存到服务中

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

我有这样一个简单的场景

应用程序从主视图(/Main)启动,然后单击右上角按钮进入子视图(/Sub)

在应用程序启动期间,
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
});