使用ng-route时,根据依赖关系解决错误加载不同的模板

时间:2014-12-28 19:00:45

标签: javascript angularjs ngroute

假设我有一条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 / {id}" 时停留的" user.html"

注2:

我提出的一个解决方案是设置错误拦截器,并通过一些有关错误的数据来解决promise,通过它我可以检测到控制器上的错误并将其公开给scope。因此,我可以在" user.html" 的根目录中使用ng-switch切换到正常案例和不同错误案例的不同模板。
但我实际上并不喜欢这个解决方案,因为我想为所有路由设置一个全局404模板,因为找不到它们的资源,所以它们的依赖关系都没有被解析。

1 个答案:

答案 0 :(得分:1)

templateUrl可以是一个函数,它将当前params(:id)的对象作为参数,但该函数在解析之前被称为。因此,您可以根据其中的ID进行一些基本检查,但不能使用解析服务调用的结果。