推迟执行页面控制器,直到收集初始化数据

时间:2015-07-10 13:29:10

标签: javascript angularjs

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

我也不能使用承诺,部分原因是它没有解决我的问题,我不希望页面开始加载,部分原因是它无法更新很容易,我不想总是使用承诺来获取这个基本数据

这是我迄今为止所尝试过的:

我的服务

SELECT UD.[Username], LD.[TransId], LD.Remarks 
FROM dbo.UserDetails  UD
INNER JOIN dbo.LeaveDetails LD
 ON UD.PKField = LD.FKField  <-- Change this to be your actual relationship
--Maybe ON UD.ClientUserID = LD.ClientUserID --Instead of above
WHERE LD.ClientUserId=@UID 
  AND LD.[TransId] = @TransId

我的页面控制器:

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;
        }
    };
});

4 个答案:

答案 0 :(得分: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对象指针不会更改,控制器也将更新。

答案 1 :(得分:0)

您使用的是ngRoute吗?如果是这样,听起来你想要的是在路由上有一个resolve属性,要求它们在更改新路径的路径之前加载一些东西。

请参阅the ngRoute docs并搜索resolve

答案 2 :(得分: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;
});

答案 3 :(得分: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) {

            });
        }
    };     
});