AngularJS'否则'如果另一个控制器上的分辨率失败,则控制器不会运行

时间:2014-09-03 05:04:44

标签: javascript angularjs

假设我们在配置中定义了路由:

$routeProvider
.when('/person/:person_id', {
  controller: 'person',
  templateUrl: 'partials/person.html',
  resolve: {
      data: ['api', '$route',
          function(api, $route) {
              return api('api/person/page/' + $route.current.params.person_id);
          }
      ]
  }
})
.otherwise({
  controller: 'error',
  templateUrl: 'partials/404.html',
});

此外,我们可以确定所有控制器,视图和API端点都存在。

现在,当我们导航到不存在的路由时,例如:blahblah/foobar,路由器的行为与我期望的一样:运行'错误'控制器,并显示 404.html

但是,如果API端点返回404时/person/:person_id的分辨率失败(因为该人不存在) - Angular表现出一种有些不稳定的行为,它既不会运行'人'控制器,也不会运行'错误'控制器,但正确显示404部分。

我想知道如何在解析失败时让Angular运行'错误'控制器,就像路径不存在时一样。

- 编辑 -

请记住,由于应用程序要求,我无法重定向。

路由器需要保留错误的URL,而不是重定向到专用的404路由。

1 个答案:

答案 0 :(得分:3)

根据$routeProvider的{​​{3}},如果解析阻止失败,则会有$routeChangeError个事件。您可以将侦听器连接到该事件并手动重定向到错误页面,但这需要您向其添加URL。

.otherwise ({
    url: '/ohmy',
    controller: 'error',
    templateUrl: 'partials/404.html',
});

在某处,可能在module.run函数

angular.module('myModule').run(['$rootScope', '$location', 
    function($rootScope, $location) {
        $rootScope.$on('$routeChangeError', function() {
            $location.path('/ohmy');
        });
}]);