2015-06-10 38 views
1

我移動第一應用需要用於導航可點擊表中的行,其通過ngClick與window.location.href土地重定向兩次

<tr ng-repeat="foo in bar" ng-click="go_to(foo.id)" > 

解決()函數是在控制器範圍內定義如The go_to:

$scope.go_to = function (in_id) { 
    var url = "#details/" + in_id; 
    window.location.href = url; 
}; 

而且#details通過ngRoute路由:

.when('/details/:id', { 
      templateUrl : 'foo.html', 
      controller : 'fooController' 
     }) 

的表 - 行很好地調用了go_to函數,但它在歷史記錄中重複兩次#details/x頁面,其中第一個命中是常量重定向到下一個,所以後退按鈕變得無用。 IE:假設我們有兩頁; Main和Sub,其中Main具有ng-click(go_to)功能。在單擊ng之前,瀏覽器歷史記錄看起來像[Main]。點擊後,它看起來像[Main,Sub,Sub]。反擊,無論次數如何,都會讓你着迷於Sub。

有沒有任何連貫的解釋爲什麼應用程序的行爲是這樣的?它的所有替代方案也非常歡迎

+1

是否有任何不使用$ location服務的理由? – TMichel

+0

是的。愚蠢顯然 – JonasR

+0

不要太自己:)不管怎樣,歡迎來到SO! – TMichel

回答

4

由於您使用的是Angular應用程序,因此使用window.location.href更改頁面並不是正確的做法,因爲它會有效地導致整個頁面重新加載,因此您的整個Angular應用程序將被重新加載。你有什麼是一個單頁面的應用程序,你應該這樣對待,即。除非你絕對必須避免重新加載頁面。

因此,推薦的做法是使用$location服務來更改顯示給用戶的頁面。像

$scope.go_to = function (in_id) { 
    var url = "#details/" + in_tg_id; 
    $location.url(url); 
}; 

$route服務手錶$location.url()(根據它的文檔),因此在一個$location.url()變化將導致正確的路由要被顯示給用戶。

+0

太棒了,謝謝! – JonasR

3

你應該使用這樣的$位置服務....

$scope.go_to = function (in_id) { 
    var url = "/details/" + in_id; 
    $location.path(url); 
}; 

而且解決您的語法。

0

我的webapp中也有同樣的問題,唯一的區別是我使用ngNewRouter並在配置中定義組件。對於我來說,當我點擊表格行時,瀏覽器(IE11)在我做window.location.href =#/ newpath或$ window.location.href =#/ newpath時至少停留6-7秒。