2014-03-06 14 views
8

Ich habe einen Controller, wo ich manchmal aktualisieren Sie den Speicherort mit $location.search({param1: newParam1Value).Gibt es eine Möglichkeit, reloadOnSearch in einem Controller bedingt auszuschalten?

Wenn ich absichtlich $ location.search in der Steuerung ändere, möchte ich ein Nachladen verhindern. Ansonsten möchte ich das Standardverhalten reloadOnSearch für diese Route/diesen Zustand beibehalten.

Ich kann reloadOnSearch auf false setzen, wenn ich den Zustand definiere, aber dann wird es immer falsch sein.

Gibt es eine Möglichkeit, die reloadOnSearch für die Route aus dem Controller umschalten? Alternativ kann ich reloadOnSearch: true behalten und nur verhindern, dass ich für die eine Instanz, für die ich das nicht möchte, einen anderen Weg zurücklade?

Ich verwende ui.router.

+0

Siehe http://stackoverflow.com/questions/19137504/force-angularjs-to-reload-a-route-although-option-reloadonsearch-is-set-to-false –

+0

ich versuche, tun das genaue Gegenteil von dem, was in diesem Beitrag beschrieben ist – Justin

+0

Es ist das gleiche. Sie müssen $ routeUpdate einhängen und an $ route.reload() delegieren, es sei denn, Sie haben die Route aktualisiert ... –

Antwort

1

Es gibt keine Möglichkeit, dies direkt vom Routenkonfigurationsblock aus zu tun. Stattdessen müssen Sie reloadOnSearch: false in der Route Config gesetzt und Route Reload manuell in Ihrem Controller behandeln, etwa so:

app.controller('MyCtrl', function ($rootScope, $route){ 
    var reloadOnSearch = true; //set reloadOnSearch within controller 
    $rootScope.$on('$routeUpdate', function(){ 
    if (shouldReload) { 
     $route.reload(); 
    } 
    }); 
}); 
1

ich diese gleiche Funktionalität benötigt, und hier ist, was ich kam mit:

Wie an anderer Stelle erwähnt , müssen Sie reloadOnSearch = false in der Route drehen. Aber die meiste Zeit, Sie möchten, dass es sich so verhält, als wäre es mit true eingestellt. Sie möchten nur unter bestimmten Umständen überspringen. Also habe ich das zu meinem Controller hinzugefügt:

$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); 
    }; 

dann werden alle Änderungen an der URL immer noch wie gewohnt neu geladen. Aber wenn Sie das Neuladen überspringen möchten, rufen Sie updateSearchWithoutReload(key, values); an und es wird nur für diesen Anruf übersprungen. Nach dem Überspringen wird es zurückgesetzt, um das Neuladen nicht zu überspringen.

hatte ich versucht, nur $rootScope.skipNextSearchChangeReload = true Einstellung und dann $location.search(k, v) und dann $rootScope.skipNextSearchChangeReload = false, aber offenbar die Ereignisse nicht den ganzen Weg propagiert hatte durch und skipNextSearchChangeReload-false gesetzt wurde, bevor es übersprungen hatte. Das war also das Beste, was ich mir vorstellen konnte.

1

Ja !! Sie können reloadOnSearch bedingt verwenden. Wir wissen, dass der Status mit dem $ location.search() -Ereignis neu geladen wird. Wenn Ihr Anwendungsfall so ist, dass in einigen Fällen Sie Zustand neu geladen werden sollen und in anderem Fall, dass Sie nicht tun, dann reloadOnSearch wie folgt verwenden:

$scope.myClickEvent = function() { 
    // prevent a reload 
    $state.current.reloadOnSearch = false; 
    $location.search('page', 2); 

    // Do your code... 

    loadData(); 
} 

/* API-Aufruf Daten laden */

var function loadData() { 
    // Do your code... 

    // Allow to reload state 
    $state.current.reloadOnSearch = undefined; 
} 
Verwandte Themen