我仍在学习 angularjs,所以也许有些愚蠢的东西我不理解,但是在使用路由时我有一个非常奇怪的行为。
在我的应用程序中,我使用以下代码来定义我的路线:
var app = angular.module('app', []);
app.config(['$routeProvider', '$locationProvider', function ($routeProvider, $locationProvider) {
$routeProvider.
when('/pneumatici/:chunka', {}).
when('/pneumatici/:chunka/:chunkb', {});
$locationProvider.html5Mode(true);
}]);
在控制器中,我以这种方式管理它们:
app.controller('appCtrl', ['$scope', '$route', '$routeParams', '$location', function ($scope, $route, $routeParams, $location) {
$scope.$on('$routeChangeSuccess', function (current,previous) {
if (!($location.path().indexOf('/pneumatici') === -1)) {
$scope.chunka = $route.current.params.chunka; $scope.chunkb = $route.current.params.chunkb;
/** do my stuff with chunka and chunkb **/
} else {
window.location.href = $location.path();
}
});
我没有 ngView,没有模板,什么都没有。它就像一个魅力。
请注意我实际强制页面加载的行,以防 url 不打算由控制器 appCtrl 管理。我被迫这样做,因为一旦我定义了捕获“$ routeChangeSuccess”的路线,点击时页面中的所有链接都会被角度捕获,即使链接没有使用“when”定义的格式,也不会发生页面加载。我想用“否则”来做,但如果可行的话,我不明白怎么做。
现在的问题。 在页面中,我当然有像“/privacy.html”这样的链接,如果我点击它们,页面加载就会正确触发,我确实看到了“/privacy.html”,但不幸的是,如果我点击后退按钮,我可以看到浏览器的 url 更改为(比方说)/pneumatici/foo/bar 但没有触发页面加载。
请注意,在 privacy.html 页面中,我没有定义角度路由,没有 .config 没有 .when;定义了一个带有控制器的anagular应用程序,但没有在任何地方注入“$ routeProvider”,也没有定义任何路由。
怎么了?我做错了什么?
谢谢你的帮助!
更新。 我找到了一个可行的解决方案添加:
angular.element("a").prop("target", "_self");
对于“target”设置为“_self”的所有“a”元素,角度路由都被忽略,不知道。
尽管如此,如果我从整体上看这个策略对我来说听起来不是很优雅,我很想改进它。我不喜欢的是,因为我在 .config 中定义了路线,所以我应该能够告诉 angular 跳过与我在那里定义的格式/路径不匹配的任何 url。
但是我不知道这是否可行,有人知道吗?