ngClick with window.location.href land redirect两次

时间:2015-06-10 08:36:18

标签: javascript html angularjs angularjs-ng-click ngroute

我的移动优先应用程序需要可点击的表格行进行导航,它通过

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

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-click之前,浏览器历史记录如下所示[Main]。单击它后,它看起来像[Main,Sub,Sub]。无论多少次,都会让你回到Sub。

是否有任何连贯的解释为什么应用程序以这种方式运行?其他解决方案也非常受欢迎

3 个答案:

答案 0 :(得分: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()中的更改将导致向用户显示正确的路线。

答案 1 :(得分:3)

您应该像这样使用$ location服务....

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

同时修复语法。

答案 2 :(得分:0)

我在webapp中也有同样的问题唯一的区别是我正在使用ngNewRouter并在配置中定义组件。对我来说,当我点击表格行时,当我从javascript执行window.location.href =#/ newpath或$ window.location.href =#/ newpath时,浏览器(IE11)会被卡住至少6-7秒。