假设我有一个user
路由,并且我已经像这样配置了$routeProvider
:
$routeProvider.when("/user/:id", {
templateUrl: "templates/user.html",
controller: "userController",
resolve: {
user: function(User, $route){
// Assume that User.get(id) will return a promise for user data
return User.get($route.current.params.id);
}
}
});
//...
问题:
在某些情况下,user
可能无法解决。例如,用户可能不存在(404),或者当前用户可能无权访问此用户的页面(403),等等。像大多数网站一样,我想使用我自定义的错误页面来处理这些类型的错误。问题是模板已经被获取,我无法将其更改为"templates/errors/404.html"。
注1:
我不想将路由重定向到"/pageNotFound.html"之类的东西,因为这显然是不对的!我希望路由在加载"404.html"模板而不是"user.html"时保持在"/user/{id}"。
注2:
我想出的一个解决方案是设置一个错误拦截器,并使用一些有关错误的数据来解决承诺,通过它我可以检测控制器上的错误并将其暴露给scope
。因此,我可以在"user.html"的根目录中使用一个ng-switch
,该在正常情况下和不同的错误情况下切换到不同的模板。
但我实际上不喜欢这个解决方案,因为我想为所有路由设置一个全局 404 模板,因为找不到它们的资源而无法解析它们的依赖项。
templateUrl
可以是一个函数,它将当前参数(:id)的对象作为参数,但该函数在解析之前被调用。因此,您可以根据那里的 id 进行一些基本检查,但不能使用解析的服务调用的结果。