如果我有一个级别的路由,那么哈希链接按预期工作,没有重新路由。但是我有一些国家/地区的网址,如果我尝试使用hash / kh #project之类的哈希标签,页面会重新路由,这非常烦人。
因此,如果我在页面国家/地区并点击#developing链接,那么页面将滚动到#developing而不重新路由,这是所希望的。如果我在页面country / kh上,我点击#projects,页面将重新路由,然后滚动到#projects;我不希望重新路由发生。
问题仅发生在自然page1 / parameter#anchor的链接上,而不是简单的pageA#anchor。
答案 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代码,则单击页面中的锚点时
/anchor
。 i.el http://url.com/#anchor
此行为将阻止页面向下滚动到哈希,因为网址中没有哈希值。
只需添加$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();
});
使用上面的代码,
/anchor
anchor
你唯一不喜欢的是网址。它看起来很脏,但我不介意。
即。 HTTP:/ngmap.github.io/basics.html#/map-geolocation#map-geolocation
希望有所帮助