gpt4 book ai didi

javascript - AngularJS/用户界面路由器 : handle 404 on resolve

转载 作者:数据小太阳 更新时间:2023-10-29 05:33:23 24 4
gpt4 key购买 nike

我是 AngularJS 和 ui-router 的初学者,正在尝试处理未找到资源的 404。我希望在不更改地址栏中的 URL 的情况下显示错误。

我已经这样配置了我的状态:

app.config([
"$stateProvider", function($stateProvider) {
$stateProvider
.state("home", {
url: "/",
templateUrl: "app/views/home/home.html"
})
.state("listings", {
abstract: true,
url: "/listings",
templateUrl: "app/views/listings/listings.html"
})
.state("listings.list", {
url: "",
templateUrl: "app/views/listings/listings.list.html",
})
.state("listings.details", {
url: "/{id:.{36}}",
templateUrl: "app/views/listings/listings.details.html",
resolve: {
listing: [
"$stateParams", "listingRepository",
function($stateParams, repository) {
return repository.get({ id: $stateParams.id }).$promise;
}
]
}
})
.state("listings.notFound", {
url: "/404",
template: "Listing not found"
});
}
]);

(我实际上是在使用 TypeScript,但我试图将上面的更改为纯 JavaScript)

比方说,如果我导航到以下网址:http://localhost:12345/listings/bef8a5dc-0f9e-4541-8446-4ebb10882045那应该打开 listings.details 状态。但是,如果该资源不存在,从 resolve 函数返回的 promise 将失败并返回 404,我在这里捕获到:

app.run([
"$rootScope", "$state",
function($rootScope, $state) {
$rootScope.$on("$stateChangeError", function(event, toState, toParams, fromState, fromParams, error) {
event.preventDefault();
if (error.status === 404) {
$state.go("^.notFound", null, { location: true, relative: toState });
}
});
}
]);

我在这里要做的是进入 listings.notFound 状态,而不更改地址栏中的目标 URL。我使用相对路径是因为我想将此逻辑重新用于其他资源。

但是,我得到一个异常(exception):

Path '^.notFound' not valid for state 'listings.details'

发生此错误是因为 $stateChangeError 事件给出的 toState 参数不知道其父级,即 toState.parent 未定义。在 ui-router 的 transitionTo 函数中,我可以看到作为参数给出的对象是 to.self,它只提供了信息的一个子集。使用 relative: $state.get(toState.name) 也无济于事,因为内部 ui-router 再次返回 state.self

我想避免维护绝对路径列表,并重写在状态层次结构中导航的逻辑(无论它多么简单,DRY 等等)。

我做错了吗,还有另一种处理 404 的正确方法吗?如果不是,最好的方法是什么?

最佳答案

最好使用$urlRouterProvider 来处理这种异常

app.config([
"$stateProvider", "$urlRouterProvider", function ($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise('/404');
// define states
}]);

关于javascript - AngularJS/用户界面路由器 : handle 404 on resolve,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24862540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com