This is my ui-router
config for a specific route
state('app.merchant', {
url: '/start/merchant',
views: {
'mainView': {
templateUrl: "partials/start_merchant.html"
}
},
css: ['assets/vendor/bootstrap/dist/css/bootstrap.css','assets/css/styles.css','assets/css/plugins.css'],
title: 'Buttons',
resolve: {
userRequired: userRequired,
}
resolve: loadSequence('flow','angularFileUpload','MerchantWizardCtrl')
})
The problem is, the page is being displayed even though it doesn't meet the userRequired
requirement. This is the function for userRequired
:
function userRequired($q, $location, $auth,Account) {
var deferred = $q.defer();
if ($auth.isAuthenticated()) {
Account.getUserStatus()
.then(function(response){
if(response.data == true){
deferred.resolve();
}
else{
deferred.reject();
}
})
.catch(function(response){
console.log("Error has occur, Please contact adminstrator");
});
} else {
deferred.resolve();
}
return deferred.promise;
}
How to resolve this? Thanks!!
EDIT
loadsequence:
function loadSequence() {
var _args = arguments;
return {
deps: ['$ocLazyLoad', '$q',
function ($ocLL, $q) {
var promise = $q.when(1);
for (var i = 0, len = _args.length; i < len; i++) {
promise = promiseThen(_args[i]);
}
return promise;
function promiseThen(_arg) {
if (typeof _arg == 'function')
return promise.then(_arg);
else
return promise.then(function () {
var nowLoad = requiredData(_arg);
//console.log(nowLoad)
if (!nowLoad)
return $.error('Route resolve: Bad resource name [' + _arg + ']');
return $ocLL.load(nowLoad);
});
}
function requiredData(name) {
if (jsRequires.modules)
for (var m in jsRequires.modules)
if (jsRequires.modules[m].name && jsRequires.modules[m].name === name)
return jsRequires.modules[m];
return jsRequires.scripts && jsRequires.scripts[name];
}
}]
};
}
You are not reject the promise when the getUserStatus() services throw an exception (in the .catch()), and also when is not Authenticated must reject, try this solution:
state('app.merchant', {
url: '/start/merchant',
views: {
'mainView': {
templateUrl: "partials/start_merchant.html"
}
},
css: ['assets/vendor/bootstrap/dist/css/bootstrap.css','assets/css/styles.css','assets/css/plugins.css'],
title: 'Buttons',
resolve: {
userRequired: userRequired,
loadSequence: loadSequence('flow','angularFileUpload','MerchantWizardCtrl')
}
})
function userRequired($q, $location, $auth,Account) {
return $q(function(resolve, reject) {
if ($auth.isAuthenticated()) {
Account.getUserStatus()
.then(function(response){
if(response.data == true){
resolve();
}
else{
reject();
}
})
.catch(function(response){
console.log("Error has occur, Please contact adminstrator");
reject()
});
} else {
reject()
}
});
}
function loadSequence() {
var _args = arguments;
return ['$ocLazyLoad', '$q', function ($ocLL, $q) {
var promise = $q.when(1);
for (var i = 0, len = _args.length; i < len; i++) {
promise = promiseThen(_args[i]);
}
return promise;
function promiseThen(_arg) {
if (typeof _arg == 'function')
return promise.then(_arg);
else
return promise.then(function () {
var nowLoad = requiredData(_arg);
//console.log(nowLoad)
if (!nowLoad)
return $.error('Route resolve: Bad resource name [' + _arg + ']');
return $ocLL.load(nowLoad);
});
}
function requiredData(name) {
if (jsRequires.modules)
for (var m in jsRequires.modules)
if (jsRequires.modules[m].name && jsRequires.modules[m].name === name)
return jsRequires.modules[m];
return jsRequires.scripts && jsRequires.scripts[name];
}
}]
}
Changed the defer method to the Promise A+ method (i recommend this way).
Add the reject() inside the .catch
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With