我有一个控制器,我有时使用$location.search({param1: newParam1Value)
更新位置。
当我故意在控制器中更改$ location.search时,我想阻止重新加载。否则,我想保留此路由/状态的默认reloadOnSearch
行为。
我可以在定义状态时将reloadOnSearch
设置为false,但它始终为false。
有没有办法在控制器内切换路由的reloadOnSearch
?或者,我可以保留reloadOnSearch: true
并且只是阻止为我不希望它发生的一个实例重新加载吗?
我正在使用ui.router
。
答案 0 :(得分:1)
我需要同样的功能,这就是我想出的:
如其他地方所述,您需要在路线中转为reloadOnSearch = false
。但是在大多数情况下,你希望它像以前一样设置为true
。你只想在某些情况下跳过。所以我把它添加到我的控制器:
$rootScope.skipNextSearchChangeReload = false;
$scope.$on('$routeUpdate', function(){
if (!$rootScope.skipNextSearchChangeReload) {
$route.reload();
} else {
// skip reload, but reset to stop skipping
$rootScope.skipNextSearchChangeReload = false;
}
});
var updateSearchWithoutReload = function(key, values) {
$rootScope.skipNextSearchChangeReload = true;
$location.search(key, values);
};
然后对网址的所有更改仍会像往常一样重新加载。但是当你想跳过重新加载时,你打电话给updateSearchWithoutReload(key, values);
,它会跳过那个电话。然后,在跳过之后,它将重置为不跳过重新加载。
我曾尝试过设置$rootScope.skipNextSearchChangeReload = true
然后设置$location.search(k, v)
然后设置$rootScope.skipNextSearchChangeReload = false
,但显然这些事件并未一直传播,而skipNextSearchChangeReload
已设置完毕在跳过之前false
。所以这是我能想到的最好的。
答案 1 :(得分:1)
是!!您可以有条件地使用reloadOnSearch
。我们知道使用$ location.search()事件重新加载状态。如果您的用例是这样的,在某些情况下您想要重新加载状态,而在其他情况下则不需要,请使用reloadOnSearch
这样:
$scope.myClickEvent = function () {
// prevent a reload
$state.current.reloadOnSearch = false;
$location.search('page', 2);
// Do your code...
loadData();
}
/ * API调用加载数据 * /
var function loadData() {
// Do your code...
// Allow to reload state
$state.current.reloadOnSearch = undefined;
}