Angular Js 解析方法的问题
Issue with Angular Js resolve method
您好,我有一个如下所示的 $stateProvider。
$stateProvider .state('team.details', {
url: '/:teamId',
views: {
'@': {
controller: 'teamDetailsCtrl',
templateUrl: 'src/modules/team/details/teamDetails.html',
resolve: {
user: function ($stateParams, TeamResource) {
return TeamResource.get({ teamid: $stateParams.teamId }).$promise;
}
TeamResource.get 正在调用 rest api,如果数据从 rest api(teamid 存在于 DB 中)发送,一切正常。但是如果数据不存在,那么我必须将它路由到 "home"。我怎样才能完成它?
您的 API return 有什么样的反应?我的建议是为您的应用程序设置一个全局 http 拦截器,它可以侦听 404 响应。在这种情况下,将用户重定向到您所在的州。
通过将逻辑放在拦截器中而不是解析中,如果您有多个可能受益于这种检查的状态,则可以避免冗余代码。
这是一个示例拦截器,取自 this SO post。
请注意,这可能只需要特定端点(例如团队)。您可以通过访问响应的 url 属性 来检查调用了哪个 url。像这样:response.url
var interceptor = ['$q', '$state', function ($q, $state) {
function success(response) {
return response;
}
function error(response) {
var status = response.status;
var url = response.url;
if (status == 404) {
$state.go('home')
return;
}
// otherwise
return $q.reject(response);
}
return function (promise) {
return promise.then(success, error);
}
}];
$httpProvider.responseInterceptors.push(interceptor);
你决定可以处理那件事,如果数据在那里,那么 return 使用链承诺的数据,否则将其重定向到不同的状态。
代码
resolve: {
user: function($stateParams, TeamResource, $state) {
return TeamResource.get({
teamid: $stateParams.teamId
}).$promise.then(function(data) {
if (!data.length > 0) { //here might be you need to use something else instead of data
$state.go('home')
return
} else {
return data;
}
});
}
Angular $http.get()
returns 承诺本身。如果出现任何错误,您只需要使用 $q
服务拒绝即可。
解决中:
resolve : {
user : function ($stateParams, TeamResource) {
return TeamResource.get({
teamid : $stateParams.teamId
});
}
}
在TeamResource.get下:
return {
get : function (teamObj) {
$http.get("/url", teamObj).then(function (resp) {
if (resp.length) {
return resp;
} else {
return $q.reject(resp);
}
}, function (err) {
return $q.reject(resp);
});
}
}
In case of return in promise()
with $q.reject()
, the promise chain sends it to error callback to the next chain and if you just return with something, it sends it to success function in next promise chain.
您好,我有一个如下所示的 $stateProvider。
$stateProvider .state('team.details', {
url: '/:teamId',
views: {
'@': {
controller: 'teamDetailsCtrl',
templateUrl: 'src/modules/team/details/teamDetails.html',
resolve: {
user: function ($stateParams, TeamResource) {
return TeamResource.get({ teamid: $stateParams.teamId }).$promise;
}
TeamResource.get 正在调用 rest api,如果数据从 rest api(teamid 存在于 DB 中)发送,一切正常。但是如果数据不存在,那么我必须将它路由到 "home"。我怎样才能完成它?
您的 API return 有什么样的反应?我的建议是为您的应用程序设置一个全局 http 拦截器,它可以侦听 404 响应。在这种情况下,将用户重定向到您所在的州。
通过将逻辑放在拦截器中而不是解析中,如果您有多个可能受益于这种检查的状态,则可以避免冗余代码。
这是一个示例拦截器,取自 this SO post。
请注意,这可能只需要特定端点(例如团队)。您可以通过访问响应的 url 属性 来检查调用了哪个 url。像这样:response.url
var interceptor = ['$q', '$state', function ($q, $state) {
function success(response) {
return response;
}
function error(response) {
var status = response.status;
var url = response.url;
if (status == 404) {
$state.go('home')
return;
}
// otherwise
return $q.reject(response);
}
return function (promise) {
return promise.then(success, error);
}
}];
$httpProvider.responseInterceptors.push(interceptor);
你决定可以处理那件事,如果数据在那里,那么 return 使用链承诺的数据,否则将其重定向到不同的状态。
代码
resolve: {
user: function($stateParams, TeamResource, $state) {
return TeamResource.get({
teamid: $stateParams.teamId
}).$promise.then(function(data) {
if (!data.length > 0) { //here might be you need to use something else instead of data
$state.go('home')
return
} else {
return data;
}
});
}
Angular $http.get()
returns 承诺本身。如果出现任何错误,您只需要使用 $q
服务拒绝即可。
解决中:
resolve : {
user : function ($stateParams, TeamResource) {
return TeamResource.get({
teamid : $stateParams.teamId
});
}
}
在TeamResource.get下:
return {
get : function (teamObj) {
$http.get("/url", teamObj).then(function (resp) {
if (resp.length) {
return resp;
} else {
return $q.reject(resp);
}
}, function (err) {
return $q.reject(resp);
});
}
}
In case of return in
promise()
with$q.reject()
, the promise chain sends it to error callback to the next chain and if you just return with something, it sends it to success function in next promise chain.