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页。
因此,当我单击这些导航项时,相应的页面会正确打开。
还有一些我尚未创建的页面。 但按照以下功能。
当我没有不存在的东西时,它必须返回到文件夹根目录中的
发生了什么,我没有在控制台中收到错误,地址栏中的URL反映了最后点击的有效页面。
有人让我知道我在哪里做错了,这个方法对于动态路由是否正确?
在您的情况下,路由匹配,但模板在指定的URL处不可用。
您能做什么,以某种方式(见下文)检查模板是否可用以及是否使用
为了确定页面是否有效(即其模板是否可用),您可以尝试访问模板(使用
我最喜欢的方法是保留"有效"/现有页面的列表并检查它。如果当前页面可用,请像往常一样继续获取模板等。如果没有,请重定向到错误页面。
上面描述的逻辑可以放在
例如。:
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'}); |