有没有办法有条件地关闭控制器中的reloadOnSearch?

时间:2014-03-06 00:35:12

标签: javascript angularjs angular-ui-router

我有一个控制器,我有时使用$location.search({param1: newParam1Value)更新位置。

当我故意在控制器中更改$ location.search时,我想阻止重新加载。否则,我想保留此路由/状态的默认reloadOnSearch行为。

我可以在定义状态时将reloadOnSearch设置为false,但它始终为false。

有没有办法在控制器内切换路由的reloadOnSearch?或者,我可以保留reloadOnSearch: true并且只是阻止为我不希望它发生的一个实例重新加载吗?

我正在使用ui.router

2 个答案:

答案 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;
}