7

我仍在学习 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。

但是我不知道这是否可行,有人知道吗?

4

2 回答 2

1

通过打开 html5mode,您的应用应该会默认拦截网站上的所有内容(来自“/”。)

从这个角度来看,似乎 $location.path() 应该在您的显式覆盖中工作,但它并不真正正确($location.url()将是)并且浏览器已经具有正确的 URL,所以也许您不能强制重新加载location.href = location.href在您的特定浏览器中。

与其走这条路,我会做以下事情来让它干燥:

如果添加基本 href:

<base href="/pneumatici/"></base>

并在您的条款中替换/pneumatici/为:/when

$routeProvider.
    when('/:chunka', {}).
    when('/:chunka/:chunkb', {});

那么你应该只需要这个:

$scope.$on('$routeChangeSuccess', function (current,previous) {

    $scope.chunka = $route.current.params.chunka;
    $scope.chunkb = $route.current.params.chunkb;

  /** do my stuff with chunka and chunkb **/
});
于 2013-08-09T14:19:32.527 回答
0

我认为你应该让 Angular 像这样管理你的所有路由:

var app = angular.module('app', []).config(function($routeProvider, $locationProvider) {
$locationProvider.html5Mode(true).hashPrefix('!');

$routeProvider
    .when('/',
    {
        controller: 'HomeController',
        templateUrl: '/partials/home.html'
    })
    .when('/about',
    {
        controller: 'AboutController',
        templateUrl: '/partials/about.html'
    })
    .when('/privacy',
    {
        controller: 'PrivacyController',
        templateUrl: '/partials/privacy.html'
    })
    .when('/404',
    {
        controller: 'NotFoundController',
        templateUrl: '/partials/404.html',
    })
    .otherwise({
        redirectTo: '/404'
    });
});

请注意上述其他情况。这告诉 Angular 在无法识别路线时加载 404 页面。

于 2013-08-08T05:28:09.443 回答