0

我开始使用 ocLazyload 来延迟加载我的一些 AngularJs 控制器。我已经用它和$routeProvider这样的

  $routeProvider.when("/login", {
        templateUrl: "login.html",
        resolve: {
            loadCtrl: ['$ocLazyLoad', function($ocLazyLoad) {
                return $ocLazyLoad.load('LoginCtrl.js');
            }]
        }
    }).

这很好用。

我有另一个路由定义,它resolve在加载控制器之前使用属性来解析几个项目。

 when("/dashboard", {
        templateUrl: "dashboard.html",
        controller: "DashboardCtrl",
        resolve: {
            profileData: getProfile,
            count : getCount
        }
    }).

现在我也想延迟加载这个控制器,我试过这样

   when("/dashboard", {
        templateUrl: "dashboard.html",
        resolve: {
            profileData: getProfile,
            count : getCount,
            loadCtrl: ['$ocLazyLoad', function($ocLazyLoad) {
                return $ocLazyLoad.load(['DashboardCtrl.js']);
            }]
        }
    }).

在这种情况下页面会加载,但profileDataandcount不会被注入到控制器中。控制器定义如下。

var app = angular.module('gt');
app.controller('DashboardCtrl', ['$scope', '$rootScope', 'profileData', 'count',
    function($scope, $rootScope, profileData, count) {
...
}]);

在调试时,我意识到调用了getProfileandgetCount方法,但它是异步发生的,并且控制器也会延迟加载而不等待这些方法。如何同时注入和延迟加载?我可以使用承诺以任何方式解决这个问题吗?

我正在使用 AngularJS 1.3.10 和 ocLazyLoad 1.0.5 版本

getProfile功能参考

var getProfile = function($q, $http, Profile, localStorageService) {
        var deferred = $q.defer();
        if (!localStorageService.get("loggedInUser")) {
            $http.post('/loggedin').success(function(user) {
                if (user) {
                    localStorageService.set("loggedInUser", user.email)
                    Profile.get(localStorageService.get("loggedInUser"), function(profileData) {
                        if (profileData) {
                            deferred.resolve(profileData);
                        } else {
                            deferred.resolve();
                        }
                    });
                } else {
                    deferred.reject();
                }
            });
        } else {
            Profile.get(localStorageService.get("loggedInUser"), function(profileData) {
                if (profileData) {
                    deferred.resolve(profileData);
                } else {
                    deferred.resolve();
                }
            });
        }
        return deferred.promise;
    }

getProfile.$inject = ["$q", "$http", "Profile", "localStorageService"];
4

3 回答 3

1

我可以使用以下配置来完成此工作$routeProvider

when("/dashboard", {
    templateUrl: "dashboard.html",
    controller :"DashboardCtrl"
    resolve: {
        profileData: getProfile,
        count : getCount,
        loadCtrl: ['$ocLazyLoad', function($ocLazyLoad) {
            return $ocLazyLoad.load(['DashboardCtrl.js']);
        }]
    }
}).

控制器在哪里DashboardCtrl定义DashboardCtrl.js

于 2015-09-28T06:47:22.670 回答
0

如果您需要您的解析以特定顺序发生,您可以将它们注入另一个解析中,如下所示:

   when("/dashboard", {
    templateUrl: "dashboard.html",
    resolve: {
        profileData: getProfile,
        count : getCount,
        loadCtrl: ['$ocLazyLoad', 'profileData', 'count', function($ocLazyLoad, profileData, count) {
            return $ocLazyLoad.load(['DashboardCtrl.js']);
        }]
    }
}).
于 2015-09-30T07:52:28.113 回答
0

getProfile返回getCount一个承诺?我猜这是问题,因为这是必需的。每个放入的对象都resolve应该返回一个 Promise。见文件

于 2015-09-24T09:16:30.047 回答