Javascript AngularJS多重分辨
这是我的Javascript AngularJS多重分辨,javascript,angularjs,angular-ui-router,Javascript,Angularjs,Angular Ui Router,这是我的ui路由器特定路由的配置 state('app.merchant', { url: '/start/merchant', views: { 'mainView': { templateUrl: "partials/start_merchant.html" } },
ui路由器
特定路由的配置
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')
})
问题是,即使页面不满足userRequired
要求,也会显示该页面。这是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;
}
function userRequired($location, $auth, Account) {
if ($auth.isAuthenticated()) {
Account.getUserStatus()
.then(function(response){
if(response.data == true){
console.log('Logged in!');
} else {
console.log('Not authorized!');
$location.url('/logout');
}
})
.catch(function(response){
console.log("Error has occurred, please contact administrator.");
$location.url('/logout');
});
} else {
console.log('Not authorized!');
$location.url('/logout');
}
}
如何解决这个问题?谢谢
编辑
加载顺序:
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];
}
}]
};
}
函数loadSequence(){
var_args=参数;
返回{
部门:['$ocLazyLoad','$q',
函数($ocLL,$q){
风险值承诺=$q.when(1);
对于(变量i=0,len=_args.length;i
当getUserStatus()服务引发异常(在.catch()中)时,您不能拒绝承诺,而且当未经身份验证的服务必须拒绝时,请尝试以下解决方案:
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];
}
}]
}
状态('app.merchant'{
url:“/start/merchant”,
观点:{
“主视图”:{
templateUrl:“partials/start\u merchant.html”
}
},
css:['assets/vendor/bootstrap/dist/css/bootstrap.css'、'assets/css/styles.css'、'assets/css/plugins.css'],
标题:“按钮”,
决心:{
userRequired:userRequired,
loadSequence:loadSequence('flow'、'angularFileUpload'、'merchantwizardtrl')
}
})
需要函数userq($location,$auth,Account){
返回$q(函数(解析、拒绝){
如果($auth.isAuthenticated()){
Account.getUserStatus()
.然后(功能(响应){
如果(response.data==true){
解决();
}
否则{
拒绝();
}
})
.catch(函数(响应){
日志(“发生错误,请联系管理员”);
拒绝
});
}否则{
拒绝
}
});
}
函数loadSequence(){
var_args=参数;
返回['$ocLazyLoad','$q',函数($ocLL,$q){
风险值承诺=$q.when(1);
对于(变量i=0,len=_args.length;i
- 将defer方法更改为Promise A+方法(我推荐这种方法)
- 在.catch中添加reject()
- 未经身份验证时拒绝
UserRequired
是否有效时继续加载
因此,与其使用像promise这样的异步方法,不如同步地解决依赖关系,这样可以防止页面加载
下面是我如何修改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;
}
function userRequired($location, $auth, Account) {
if ($auth.isAuthenticated()) {
Account.getUserStatus()
.then(function(response){
if(response.data == true){
console.log('Logged in!');
} else {
console.log('Not authorized!');
$location.url('/logout');
}
})
.catch(function(response){
console.log("Error has occurred, please contact administrator.");
$location.url('/logout');
});
} else {
console.log('Not authorized!');
$location.url('/logout');
}
}
首先,您的配置对象具有两倍的相同属性:
{
resolve: {userRequired: userRequired}
resolve: loadSequence('flow','angularFileUpload','MerchantWizardCtrl')
}
您应该有如下内容:
{
resolve : {
userRequired : userRequired,
loadSequence : loadSequence('flow','angularFileUpload','MerchantWizardCtrl')
}
同样,你的捕获物也应该返回一个被拒绝的承诺
return $q.reject();
如上所述,未经认证时拒绝。
您可以在chrome中进行调试,以确保调用了所有承诺并返回正确的值。其他情况是否需要延迟。拒绝(),因为$auth.isAuthenticated())将为false?@mindparse如果我应用答案并禁用loadsequence,请解决它的问题。否则它仍然会加载页面。这应该是
$ocLazyLoad
而不是$ocLL
,或者它也是这样工作的吗?您可以使用$rootScope.$on('$stateChangeError',function(event,toState,toParams,fromState,fromsparams,error){console.log(error)}
若要记录路由未解决的任何原因,在ui router中,所有错误都会拒绝解决。A我看到错误,您有两个解决方案,请更新答案。是的,我需要两个。加载顺序是将所有依赖项加载到控制器。我更新我的答案,当您需要两个解决方案时,请将它们放置在同一个对象中。已尝试过,它给出了一个错误。.参数“fn”不是函数,Get对象
使用正确的loadSequence函数更新答案