如果我的url包含路由参数,则哈希链接以角度重新路由

时间:2014-04-16 20:15:22

标签: angularjs

如果我有一个级别的路由,那么哈希链接按预期工作,没有重新路由。但是我有一些国家/地区的网址,如果我尝试使用hash / kh #project之类的哈希标签,页面会重新路由,这非常烦人。

因此,如果我在页面国家/地区并点击#developing链接,那么页面将滚动到#developing而不重新路由,这是所希望的。如果我在页面country / kh上,我点击#projects,页面将重新路由,然后滚动到#projects;我不希望重新路由发生。

问题仅发生在自然page1 / parameter#anchor的链接上,而不是简单的pageA#anchor。

4 个答案:

答案 0 :(得分:5)

如果没有任何代码示例或者没有任何代码,很难回答您的问题。我实现了一个plunker代码(http://plnkr.co/edit/oflB21?p=preview)来尝试重现这个问题但是你可以看到我无法重现这个问题。即,您可以轻松地在页面的两个不同部分之间来回导航,例如在#/ Country / Italy#Section-4和#/ Country / Italy#Section-1之间,没有任何页面加载或重新路由。请查看以下plunker的工作示例。由于缺少哈希爆炸或正斜杠或类似的细节,这很可能发生在你身上。

主页的HTML代码段:

<ul>
    <li><a href="#/Country">Go to /Country</a></li>
    <li><a href="#/Country/US">Go to /Country/US</a></li>
    <li><a href="#/Country/Italy#Section-4">Go to /Country/Italy#Section-4</a></li>
    <li><a href="#/Country/Canada#Section-8">Go to /Country/Canada#Section-8</a></li>
</ul>

国家/地区页面的HTML代码段:

<div id="Section-1" class="section pink">
    Section 1
    <div ng-if="country">
        <a ng-href="#/Country/{{country}}#Section-8">Go to /Country/{{country}}#Section-8</a>
    </div>
    <div ng-if="!country">
        <a ng-href="#/Country#Section-8">Go to /Country#Section-8</a>
    </div>
</div>

所有JavaScript代码:

var app = angular.module("app", ["ngRoute"]);

app.config(["$routeProvider", "$locationProvider", 
    function ($routeProvider, $locationProvider) {
    $routeProvider
    .when("/", {
        templateUrl: "./home-page.html",
        caseInsensitiveMatch: true,
    })
    .when("/Home", {
        templateUrl: "./home-page.html",
        caseInsensitiveMatch: true,
    })
    .when("/Country", {
        templateUrl: "./country-page.html",
        caseInsensitiveMatch: true,
    })
    .when("/Country/:country", {
        templateUrl: "./country-page.html",
        caseInsensitiveMatch: true,
    })
}]);

countryController.$inject = ["$scope", "$routeParams", "$location", "$anchorScroll"];
function countryController($scope, $routeParams, $location, $anchorScroll) {

    $scope.country = $routeParams.country;

    if (!!$location.$$hash) {
        $location.hash($location.$$hash);
        $anchorScroll();
    }
}

答案 1 :(得分:3)

好吧,我认为主要问题是Angular处理带有哈希的路由(有时候)。您需要做的是使用$anchorScroll服务。所以你的JS看起来像:

function ScrollCtrl($scope, $location, $anchorScroll) {
  $scope.gotoBottom = function (){
    // set the location.hash to the id of
    // the element you wish to scroll to.
    $location.hash('bottom');

    // call $anchorScroll()
    $anchorScroll();
  };
}

然后您的HTML可能是:

<div id="scrollArea" ng-controller="ScrollCtrl">
  <a ng-click="gotoBottom()">Go to bottom</a>
  <a id="bottom"></a> You're at the bottom!
</div>

http://plnkr.co/edit/De6bBrkHpojgAbEvHszu?p=preview - 这是一个使用$ anchorScroll的plunkr(不是我的),如果你需要在行动中看到它

答案 2 :(得分:1)

对你的问题有一个简单的解决办法......

而不是:

    <a href="page1/parameter#anchor">go</a>

只做

    <a href="#anchor">go</a>

我怀疑意外行为的原因是您正在使用的任何路由解决方案的错误/功能(即内置角度路由器,或ui-router或其他)。 ui-router有一种方法可以在去往同一路线时禁用重新路由...

答案 3 :(得分:1)

我想我遇到了同样的问题。

这是我用github页面http://ngmap.github.io完成的。

网站http://ngmap.github.io有很多页面,每个页面都有很多锚点,所有锚点都是自然编码的。

如果没有以下http://ngmap.github.io/javascripts/app.js代码,则单击页面中的锚点时

  • 它将$ location.path设置为/anchor。 i.el http://url.com/#anchor
  • 并将$ location.hash设置为``。

此行为将阻止页面向下滚动到哈希,因为网址中没有哈希值。

只需添加$location.hash并向下滚动到该锚点,一切都应该有效。

 /**
   * when the location is changed, scroll the page to the proper element.
   * by changing location hash from '' to 'hash', so that it can be used as $anchorScroll
   */
  $rootScope.$on('$locationChangeSuccess', function(newRoute, oldRoute) {
    $location.hash($location.path().replace(/^\//,"")); 
    $anchorScroll();  
  });

使用上面的代码,

  • $ location.path保持不变,/anchor
  • $ location.hash现在变为anchor

你唯一不喜欢的是网址。它看起来很脏,但我不介意。

即。 HTTP:/ngmap.github.io/basics.html#/map-geolocation#map-geolocation

希望有所帮助