ui-在 resolve 中添加 $http 或 restangular 时路由器冻结
ui-router freezing when adding either $http or restangular inside resolve
所以我解决了 ui-router/angular unpr 问题!现在,我想知道为什么 ui-router 在我添加 $http 或 restangular 调用后不会继续。也许我的延迟语法是错误的。这是代码
.state("main", {
url: "/",
views: {
'' : { templateUrl: 'views/main.html' },
'performance-ui-view@main': {
templateUrl: 'views/gdreport.html',
resolve: {
propertyUserData : function(User, RestFactory, ApiEndpoints, messageService, $q) {
var deferred = $q.defer();
RestFactory.setBaseUrl(ApiEndpoints.DataService);
RestFactory.all('gdpermissions').get('access', { 'userresourceid' : userData.resourceId })
.then(function(response) {
$rootScope.userData.isGlobalAccount = true;
User.saveData();
deferred.resolve(response);
return deferred.promise;
}, function(err){
// f'ing work around, I've already told 401 to our backend dev
$rootScope.userData.isGlobalAccount = false;
userData.saveData();
deferred.resolve(response);
})
}
},
controller : 'GlobalDashboardController'
}
}
})
不确定错误可能是什么(因为问题中未提及),似乎您没有按预期从 resolve 函数返回承诺。
propertyUserData : function(User, RestFactory, ApiEndpoints, messageService, $q) {
var deferred = $q.defer();
RestFactory.setBaseUrl(ApiEndpoints.DataService);
RestFactory.all('gdpermissions').get('access', { 'userresourceid' : userData.resourceId })
.then(function(response) {
$rootScope.userData.isGlobalAccount = true;
User.saveData();
deferred.resolve(response);
}, function(response){
// f'ing work around, I've already told 401 to our backend dev
$rootScope.userData.isGlobalAccount = false;
userData.saveData();
deferred.resolve(response);
});
return deferred.promise; //<-- Here
}
但是你可以不用创建延迟的对象,因为你的 api 调用已经 returns 一个承诺,只需做:
propertyUserData : function(User, RestFactory, ApiEndpoints, messageService, $q) {
RestFactory.setBaseUrl(ApiEndpoints.DataService);
return RestFactory.all('gdpermissions').get('access', { 'userresourceid' : userData.resourceId })
.then(function(response) {
$rootScope.userData.isGlobalAccount = true;
User.saveData();
return response;
}, function(response){
$rootScope.userData.isGlobalAccount = false;
userData.saveData();
return response;
});
}
所以我解决了 ui-router/angular unpr 问题!现在,我想知道为什么 ui-router 在我添加 $http 或 restangular 调用后不会继续。也许我的延迟语法是错误的。这是代码
.state("main", {
url: "/",
views: {
'' : { templateUrl: 'views/main.html' },
'performance-ui-view@main': {
templateUrl: 'views/gdreport.html',
resolve: {
propertyUserData : function(User, RestFactory, ApiEndpoints, messageService, $q) {
var deferred = $q.defer();
RestFactory.setBaseUrl(ApiEndpoints.DataService);
RestFactory.all('gdpermissions').get('access', { 'userresourceid' : userData.resourceId })
.then(function(response) {
$rootScope.userData.isGlobalAccount = true;
User.saveData();
deferred.resolve(response);
return deferred.promise;
}, function(err){
// f'ing work around, I've already told 401 to our backend dev
$rootScope.userData.isGlobalAccount = false;
userData.saveData();
deferred.resolve(response);
})
}
},
controller : 'GlobalDashboardController'
}
}
})
不确定错误可能是什么(因为问题中未提及),似乎您没有按预期从 resolve 函数返回承诺。
propertyUserData : function(User, RestFactory, ApiEndpoints, messageService, $q) {
var deferred = $q.defer();
RestFactory.setBaseUrl(ApiEndpoints.DataService);
RestFactory.all('gdpermissions').get('access', { 'userresourceid' : userData.resourceId })
.then(function(response) {
$rootScope.userData.isGlobalAccount = true;
User.saveData();
deferred.resolve(response);
}, function(response){
// f'ing work around, I've already told 401 to our backend dev
$rootScope.userData.isGlobalAccount = false;
userData.saveData();
deferred.resolve(response);
});
return deferred.promise; //<-- Here
}
但是你可以不用创建延迟的对象,因为你的 api 调用已经 returns 一个承诺,只需做:
propertyUserData : function(User, RestFactory, ApiEndpoints, messageService, $q) {
RestFactory.setBaseUrl(ApiEndpoints.DataService);
return RestFactory.all('gdpermissions').get('access', { 'userresourceid' : userData.resourceId })
.then(function(response) {
$rootScope.userData.isGlobalAccount = true;
User.saveData();
return response;
}, function(response){
$rootScope.userData.isGlobalAccount = false;
userData.saveData();
return response;
});
}