关于javascript:页面不会重定向到无效网址上的指定页面

Page doesn't redirect to the specified page on invalid url

我有以下Angular功能。

功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var App = angular.module('app', ['ui.bootstrap', 'ngRoute', 'ngAnimate']);

App.config(['$routeProvider', function($routeProvider) {

    $routeProvider

        .when('/', {
            templateUrl: 'views/dashboard.html'
        })
        .when('/:pages', {
            templateUrl: function(routeParams) {
                return 'views/' + routeParams.pages + '.html';
            }
        })
        .otherwise({redirectTo: '404.html'})

}]);

我有一个侧边栏导航控件。 我创建了4页。

因此,当我单击这些导航项时,相应的页面会正确打开。

还有一些我尚未创建的页面。 但按照以下功能。

当我没有不存在的东西时,它必须返回到文件夹根目录中的404.html文件。

发生了什么,我没有在控制台中收到错误,地址栏中的URL反映了最后点击的有效页面。

有人让我知道我在哪里做错了,这个方法对于动态路由是否正确?


otherwise()部分捕获与任何指定路由不匹配的路径。
在您的情况下,路由匹配,但模板在指定的URL处不可用。
$routeProvider对此一无所知,也无能为力。

您能做什么,以某种方式(见下文)检查模板是否可用以及是否使用$location重定向到适当的路径(例如/error/404)。

为了确定页面是否有效(即其模板是否可用),您可以尝试访问模板(使用$http)并捕获任何错误(表示没有模板)等。但我不喜欢这种方法(因为依赖于模板的可用性来确定页面的存在/有效性不是一个非常好的实践 - 例如,在网络或服务器问题等情况下,它很容易导致误导性错误消息)。

我最喜欢的方法是保留"有效"/现有页面的列表并检查它。如果当前页面可用,请像往常一样继续获取模板等。如果没有,请重定向到错误页面。

上面描述的逻辑可以放在$routeProviderresolve属性中(因此它在实例化控制器并加载视图之前执行)。

例如。:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
var app = angular.module(...);

// This should be a constant, so it can
// get injected into configuration blocks
app.constant('EXISTING_PAGES', [
  'page1',
  'page2',
  ...
]);

app.config(function configRouteProvider($routeProvider, EXISTING_PAGES) {    
  $routeProvider.
    when('/', {
      templateUrl: 'views/dashboard.html'
    }).
    when('/:page', {
      templateUrl: function getPageTemplateUrl(routeParams) {
        return 'views/' + routeParams.page + '.html';
      },
      resolve: {
        exists: function resolveExists($location, $route) {
          // Because this is executed before the instantiation of the
          // controller and the view is not fully loaded yet, the parameters
          // should be accessed via `$route.current.params`
          if (EXISTING_PAGES.indexOf($route.current.params.page) === -1) {
            // This is not a valid/existing page,
            // let's redirect to an appropriate error page
            $location.replace();   // Replace the URL in the history
            $location.path('/error/404');
          }
          return true;
        }
      }
    }).
    // This should be a separate route, so we can redirect to it
    when('/error/404', {
      templateUrl: '404.html'
    }).
    otherwise({
      redirectTo: '/error/404'
    });
});

另见这个简短的演示。


否则将在没有其他定义匹配时调用。但是你的/:页面定义总是匹配,否则就不会被调用。尝试加载模板时,否则定义不会对服务器上的404作出反应。

为每个页面创建路径定义的最简单的解决方案,而不是通用的。例如
.when('/ page1',...)
.when('/ page2',...)
等等


redirect要更新$ location,因此您不必指定.html,而是指定routeParameter。

你最好做这样的事情:

1
2
3
[...]
.when('/error', { templateUrl: '404.html' })
.otherwise({redirectTo: '/error'});