Я начал использовать 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"];
Я мог бы получить эту работу со следующей конфигурацией $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
Если вам нужно, чтобы ваши решения были выполнены в определенном порядке, вы можете ввести их в другое решение, например:
when("/dashboard", {
templateUrl: "dashboard.html",
resolve: {
profileData: getProfile,
count : getCount,
loadCtrl: ['$ocLazyLoad', 'profileData', 'count', function($ocLazyLoad, profileData, count) {
return $ocLazyLoad.load(['DashboardCtrl.js']);
}]
}
}).
getProfile
и getCount
возвращают обещание? Я предполагаю, что это проблема, поскольку это требуется. Каждый объект, поставленный в resolve
должен вернуть обещание. см. документацию