2013-03-18 60 views
6

我採用了棱角分明的scrollToanchorScroll這樣的:如何停止角度重新加載時的地址改變

app.controller('TestCtrl', function($scope, $location, $anchorScroll) { 
    $scope.scrollTo = function(id) { 
     $location.hash(id); 
     $anchorScroll(); 
    } 
}); 

<a ng-click="scrollTo('foo')">Foo</a> 

<div id="foo">Here you are</div> 

我的問題是,當我點擊鏈接頁面滾動下來,但在案件的50%頁面重新加載,因爲URL中的哈希值發生變化。

我如何防止重新加載頁面角?

更新: 我發現這裏

https://groups.google.com/forum/?fromgroups=#!msg/angular/BY2ekZLbnIM/MORF-z2vHnIJ

The $location service broadcasts a $locationChangeStart event. You can observe that and call event.preventDefault() to stop the navigation. Nice!

任何人都可以告訴你怎麼觀察的事件,可以防止默認

回答

1

這一事件發出在rootScope上,所以你可以使用01註冊一個觀察者方法。

$scope.$on('$locationChangeStart', function(ev) { 
    ev.preventDefault(); 
}); 
+0

我已經把在scrollTo功能和它的作品,但問題是,然後我的其他點擊左側菜單上停止工作,因爲這是chnaging哈希爲好。我怎麼只能防止在particualr點擊鏈接時,只有 – user1865341 2013-03-19 01:09:38

+0

我不知道如果你能。你可能有管理與'$ anchorScroll()'一樣好,甚至重新考慮你的設計這些鏈接。順便說一句,那個片段進入你的控制器功能不是在你的'scrollTo'功能。 – cezar 2013-03-26 18:28:44

6

您可以添加$事件參數到NG-click處理程序:

<a ng-click="scrollTo('foo', $event)">Foo</a> 

和scrollTo功能,你可以做下一個:

scope.scrollTo = function(str, event) { 
    event.preventDefault(); 
    event.stopPropagation(); 

    /** SOME OTHER LOGIC */ 
} 

但是,這意味着你應該手動解析來自「a」元素的目標錨點散列。

9

刷新正在發生的事情,因爲沒有到locationChangeStart事件的調用。您可以通過執行停止此:

scope.$on('$locationChangeStart', function(ev) { 
    ev.preventDefault(); 
}); 

其實我最後寫一個使用它這裏面叫我自己scrollTo指令。

Plnkr/Github

My other post about this here

相關問題