2015-07-10 57 views
1

我有一个SPA。我有一些基本的初始化数据,我从服务器中获取,我确定我希望推迟每个页面加载,直到数据加载。 (这些数据包含用户是否已登录,权限以及其他重要内容)。因此,如果我有用于获取和访问该数据的服务,页面控制器可能会在获取数据之前开始执行,这是不好的。推迟执行聚集

我也不能使用一个承诺,部分是因为它并没有解决我的问题,我不想让页面开始加载,部分是因为它不能很容易地更新,我不想始终使用一个承诺来获取这个基本数据

这是我试过到目前为止:

我的服务

app.factory('AppData', function($q, $http){ 

    var appData = {}; 

    $http 
     .post("/api/GeneralActions/getInitData", { 
     }).success(function (data, status, headers, config) { 
      appData = data; 
     }).error(function (data, status, headers, config) { 
     }); 

    return { 
     getAppData: function() { 
      return appData; 
     } 
    }; 
}); 

我的页面控制器:

app.controller('MainPreferences', function($scope, AppData){ 

    // when this gets executed, appData is null 
    $scope.appData = AppData.getAppData(); 

}); 

回答

1

尝试下面的代码片段

app.factory('AppData', function($q, $http){ 

    var appData = {}; 

    $http 
     .post("/api/GeneralActions/getInitData", { 
     }).success(function (data, status, headers, config) { 
      //appData = data; 
      angular.extend(appData, data); 
     }).error(function (data, status, headers, config) { 
     }); 

    return { 
     getAppData: function() { 
      return appData; 
     } 
    }; 
}); 

而是再次创造AppData的对象,只需用数据来扩展它。通过这种方式你的appData对象指针不会改变,控制器也会得到更新。

+0

最后我用这个小动作。很简单,干净 –

0

是否使用ngRoute?如果是这样,这听起来像你想要的是你的路线上有一个解析属性,要求他们加载一些东西,然后再改变路径到新路线。

the ngRoute docs和搜索resolve

0

如果您正在使用股票Angular ngRoute路由系统,则可以使用the resolve property on the route指定承诺返回函数的映射。在这些承诺全部解决之前,路由控制器不会被初始化,作为奖励,承诺的结果被注入到路由控制器中。

例如:

$routeProvider.when('/foo', { 
    controller: 'fooCtrl', 
    resolve: { 
    bar: function($http) { return $http.get('/load/the/bar'); } 
    } 
}); 

// bar is injected from the route resolve 
myApp.controller('fooCtrl', function($scope, bar) { 
    $scope.bar = bar; 
}); 
+0

,他说,他不希望调用此API每次。 – dhavalcengg

+0

但是这个应用程序的数据适用于所有路线......我不想重复所有路线 –

0

我觉得应该是:

app.factory('AppData', function($q, $http){ 

    var appData = {}; 

    return { 
     getAppData: function() { 
      $http.post("/api/GeneralActions/getInitData", {}).success(function (data, status, headers, config) { 
        return data; 
      }).error(function (data, status, headers, config) { 

      }); 
     } 
    };  
});