Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度用户界面-转换到相同状态会更新URL,但返回按钮已断开_Javascript_Angularjs_Angular Ui_Angular Ui Router - Fatal编程技术网

Javascript 角度用户界面-转换到相同状态会更新URL,但返回按钮已断开

Javascript 角度用户界面-转换到相同状态会更新URL,但返回按钮已断开,javascript,angularjs,angular-ui,angular-ui-router,Javascript,Angularjs,Angular Ui,Angular Ui Router,我的Ui路由器设置中有以下代码 .state('contacts.list', { url: "", templateUrl: "templates/contactsList.tpl.html", controller: "ContactsListCtrl" contactsFilter: "all" } }) .state('contacts.list.paginated', { url: "/page/{pageNumber}", templ

我的Ui路由器设置中有以下代码

.state('contacts.list', {
    url: "",
    templateUrl: "templates/contactsList.tpl.html",
    controller: "ContactsListCtrl"  contactsFilter: "all"
    }
})
.state('contacts.list.paginated', {
    url: "/page/{pageNumber}",
    templateUrl: "templates/contactsList.tpl.html",
    controller: "ContactsListCtrl"
})
然后我有一个角度ui分页控件,当页面被更改时,它调用这个函数

$scope.pageChanged = function(pageNumber){

    $state.go("contacts.list.paginated", {pageNumber: pageNumber});

    $scope.listParams.offset = (pageNumber -1) * $scope.itemsPerPage;

    updateList(); // Reloads the data for the new page from the server */

};
这类作品。当您从第1页单击到第2页时,它将从服务器获取下一页数据,将其放在页面上,并将地址栏中的URL更改为/2。另外,可能是因为这两个状态共享同一个控制器,所以控制器不会重新执行,这就是我想要的,因为我希望它继续执行我的$scope.pageChanged()函数,它会这样做

到目前为止还不错。URL更新,数据更新

问题是,当我点击后退按钮时,什么也没发生。如果点击第2页、第3页、第4页,然后点击后退按钮,URL将按预期更改回/page3,但不会执行控制器代码,也不会更新分页控件,也不会调用服务器以获取正确的数据

此外,如果您已经在该视图中,则在地址栏中手动键入/page/2或/page/3不会导致执行任何代码,可能是因为这只是参数的更改

我需要找到一种方法,让它在使用后退/前进按钮时重新执行控制器代码,或者监听状态/位置的变化,以便在发生这种情况时刷新数据(但在第一次点击页面时不要运行两次)


我已经搜索了SO和web的其他部分,但找不到任何线索。

尝试将
$rootScope
注入控制器,并监听
$statechangesucture
即使这样:

$rootScope.$on('$stateChangeSuccess', function() {
    $scope.listParams.offset = (pageNumber -1) * $scope.itemsPerPage;
    updateList(); // Reloads the data for the new page from the server */
});

好的,我想我有一个解决办法

让后退按钮工作的解决方案是这样做

$scope.$watchCollection('$stateParams', function(){

    ... calculate page number and offet here...

    updateList();

});
每次使用$state.go()和每次使用浏览器的“后退和前进”按钮时,都会触发此操作,而不是将其放入控制器代码中,当您单击“后退”按钮时不会重新执行此操作


我最初使用这种方法时遇到的问题是,有时我会单独更新结果,状态会发生变化,因此我的手表会被触发,AJAX代码会被调用两次。关键是永远不要更新此监视之外的结果列表,并确保每次要更新结果时,都要先更改状态或状态参数。

每次状态更改时,控制器不会重新执行,因为只有参数在更改,如果我取消了pageChanged功能,当用户单击页码按钮时,什么也不会发生。你确定吗?我认为您需要为每条路线使用单独的控制器。这不会有帮助,因为我不能为第/2页/3页/4页到第/1000页使用不同的控制器。我的意思是只有2个控制器,每条路线一个。但我想我现在更了解你的问题了。我更新了我的答案;让我知道这是否对你有效。顺便说一句,如果你可以发布你的HTML和你的控制器的代码,这将是有帮助的其余部分。