Инъекция в загруженный контроллер AngularJS при использовании ocLazyLoad

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']);
            }]
        }
    }).

В этом случае страница загружается, но profileData и count не вводятся в контроллер. Определение контроллера приведено ниже.

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

При отладке я понимаю, что метод getProfile и getCount getProfile, но он происходит асинхронно, а контроллер также ленивы, не дожидаясь этих методов. Как я ввожу и ленивую нагрузку одновременно? Могу ли я использовать обещания решить это каким-либо образом?

Я использую версии 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"];
  • 0
    Это была полезная информация.
Теги:
oclazyload

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

0

Если вам нужно, чтобы ваши решения были выполнены в определенном порядке, вы можете ввести их в другое решение, например:

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

getProfile и getCount возвращают обещание? Я предполагаю, что это проблема, поскольку это требуется. Каждый объект, поставленный в resolve должен вернуть обещание. см. документацию

  • 0
    да. добавлен метод getProfile для вашей справки

Ещё вопросы

Сообщество Overcoder
Наверх
Меню