![]()
resolve is a feature in AngularJS’s $routeProvider that preloads data before navigating to a new route. It ensures that required data is fetched before the view and controller are initialized, preventing UI flickering due to late-loading data.
1️⃣ Why Use resolve?
Ensures data is available before rendering the view.
Prevents UI flickering caused by late data loads.
Improves user experience by avoiding empty screens while fetching data.
Helps in authentication and authorization before route access.
2️⃣ Basic Example of resolve
var app = angular.module('myApp', ['ngRoute']);
app.config(function($routeProvider) {
$routeProvider
.when('/dashboard', {
templateUrl: 'dashboard.html',
controller: 'DashboardCtrl',
resolve: {
userData: function(UserService) {
return UserService.getUserData();
}
}
})
.otherwise({ redirectTo: '/' });
});
🔹 Explanation:
- Before navigating to
/dashboard, the app waits forUserService.getUserData()to complete. - The resolved data is passed to
DashboardCtrlas a dependency.
3️⃣ Accessing resolve Data in Controller
app.controller('DashboardCtrl', function($scope, userData) {
$scope.user = userData; // `userData` is injected from resolve
});
🔹 Here, userData is preloaded, so the controller starts with data already available.
4️⃣ Simulating an API Call with $q in a Service
Since resolve supports promises, we can simulate an API request using $q:
app.service('UserService', function($q, $timeout) {
this.getUserData = function() {
var deferred = $q.defer();
// Simulating an async API request
$timeout(function() {
deferred.resolve({ name: 'John Doe', role: 'Admin' });
}, 2000);
return deferred.promise;
};
});
🔹 This simulates an API request that resolves after 2 seconds.
🔹 The route won’t load until this function completes successfully.
5️⃣ Handling Resolve Errors with $routeChangeError
If the resolve function fails (e.g., API error), we can handle it using $routeChangeError.
Example: Catching Resolve Errors
app.run(function($rootScope, $location) {
$rootScope.$on('$routeChangeError', function(event, current, previous, rejection) {
console.error('Route change failed:', rejection);
$location.path('/error'); // Redirect to an error page
});
});
If UserService.getUserData() fails, the user is redirected to /error.
6️⃣ Example: Using resolve for Authentication
We can use resolve to prevent unauthorized users from accessing certain pages.
Restricting Access to Authenticated Users
app.config(function($routeProvider) {
$routeProvider
.when('/admin', {
templateUrl: 'admin.html',
controller: 'AdminCtrl',
resolve: {
auth: function(AuthService, $q, $location) {
return AuthService.isAuthenticated().then(function(isLoggedIn) {
if (!isLoggedIn) {
$location.path('/login'); // Redirect if not authenticated
return $q.reject('Not Authenticated');
}
});
}
}
});
});
The route only loads if AuthService.isAuthenticated() resolves successfully.
7️⃣ Multiple Resolve Properties
You can load multiple data sources before the route loads.
Example: Resolving Multiple Dependencies
app.config(function($routeProvider) {
$routeProvider
.when('/profile', {
templateUrl: 'profile.html',
controller: 'ProfileCtrl',
resolve: {
userProfile: function(UserService) {
return UserService.getProfile();
},
userSettings: function(SettingsService) {
return SettingsService.getSettings();
}
}
});
});
Both userProfile and userSettings must be loaded before ProfileCtrl is initialized.
