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

Loading different templates based on dependency resolve error when using ng-route

本文关键字:解决 ng-route 出错 依赖 关系 加载      更新时间:2023-09-26

假设我有一个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 进行一些基本检查,但不能使用解析的服务调用的结果。