Javascript 角度用户界面-转换到相同状态会更新URL,但返回按钮已断开
我的Ui路由器设置中有以下代码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
.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和你的控制器的代码,这将是有帮助的其余部分。