Rechargement de l'état actuel - rafraîchir les données

j'utilise un routeur UI angulaire et je voudrais recharger l'état courant et rafraîchir toutes les données / relancer les contrôleurs pour l'état courant et c'est parent.

j'ai 3 niveaux d'état: répertoire.organisation.details

répertoire.organisations contient un tableau avec une liste d'organisations. En cliquant sur un élément dans la table, vous chargez .organisation.details avec $ StateParams passant L'ID de l'élément. Ainsi, dans l'état des détails, je charge les détails de cet article, je les édite et puis je sauvegarde les données. Tout va bien jusqu'à présent.

maintenant je dois recharger cet état et rafraîchir toutes les données.

j'ai essayé:

 $state.transitionTo('directory.organisations');

qui va à l'état parent mais ne recharge pas le contrôleur, je suppose parce que le chemin n'a pas changé. Idéalement je veux juste rester dans le répertoire.organisation.détails de l'état et de l'actualisation de toutes les données dans le parent.

j'ai aussi essayé:

$state.reload()

j'ai vu cela sur le WIKI de L'API pour l'état$.recharger "(bug avec les contrôleurs réinstantier en ce moment, réparer bientôt)."

Toute aide serait appréciée?

308
demandé sur Rahil Wazir 2014-02-12 02:38:25

18 réponses

j'ai trouvé que c'était la façon la plus courte de rafraîchir avec l'ui-router:

$state.go($state.current, {}, {reload: true}); //second parameter is for $stateParams

mise à Jour pour les versions plus récentes:

$state.reload();

qui est un alias pour:

$state.transitionTo($state.current, $stateParams, { 
  reload: true, inherit: false, notify: true
});

Documentation: https://angular-ui.github.io/ui-router/site/#/api/ui.router.state.$état # methods_reload

524
répondu Rohan 2016-07-18 20:41:19

Cette solution fonctionne dans AngularJS V. 1.2.2:

$state.transitionTo($state.current, $stateParams, {
    reload: true,
    inherit: false,
    notify: true
});
145
répondu Holland Risley 2014-04-09 21:16:47

ce serait la solution finale. (inspiré du billet de @Hollan_Risley)

'use strict';

angular.module('app')

.config(function($provide) {
    $provide.decorator('$state', function($delegate, $stateParams) {
        $delegate.forceReload = function() {
            return $delegate.go($delegate.current, $stateParams, {
                reload: true,
                inherit: false,
                notify: true
            });
        };
        return $delegate;
    });
});

maintenant, chaque fois que vous avez besoin de recharger, il suffit d'appeler:

$state.forceReload();
67
répondu M K 2014-04-21 13:47:19

pour ionique cadre

$state.transitionTo($state.current, $state.$current.params, { reload: true, inherit: true, notify: true });//reload

$stateProvider.
  state('home', {
    url: '/',
    cache: false, //required

https://github.com/angular-ui/ui-router/issues/582

55
répondu RouR 2015-01-29 09:19:44

probablement l'approche la plus propre serait la suivante:

<a data-ui-sref="directory.organisations.details" data-ui-sref-opts="{reload: true}">Details State</a>

nous pouvons recharger L'État à partir du HTML seulement.

42
répondu Vaibhav Pachauri 2015-04-01 07:05:39

la réponse de @Holland Risley est maintenant disponible en tant qu'api dans le dernier ui-router.

$state.reload();

méthode qui force à recharger l'état actuel. Toutes les résolutions sont re-résolu, les contrôleurs de réintroduit, et les événements de recuit.

http://angular-ui.github.io/ui-router/site/#/api/ui.router.state.$état

19
répondu Muthukannan Kanniappan 2016-02-05 17:19:59
$state.go($state.current, $stateParams, {reload: true, inherit: false});
14
répondu Weston Ganger 2015-09-19 19:24:46
$scope.reloadstat = function () { $state.go($state.current, {}, {reload: true}); };
7
répondu user7961355 2017-05-04 06:17:11

si vous voulez recharger votre page entière, comme il semble, il suffit d'injecter $ window dans votre contrôleur et ensuite appeler

$window.location.href = '/';

mais si vous voulez seulement recharger votre vue actuelle, injecter $scope, $state et $stateParams (ce dernier juste au cas où vous avez besoin d'avoir quelques paramètres de changement dans cette prochaine recharge, quelque chose comme votre numéro de page), alors appelez cela dans n'importe quelle méthode de contrôleur:

$stateParams.page = 1;
$state.reload();

AngularJS v1.3.15 angular-ui-router v0.2.15

6
répondu MarcoSantana 2015-07-09 23:38:33

solution idiote qui fonctionne toujours.

$state.go("otherState").then(function(){
     $state.go("wantedState")
});
4
répondu Fanchi 2016-03-16 13:06:58

pour v1 angulaire.2.26, aucun des travaux ci-dessus. Un ng-click qui appelle les méthodes ci-dessus devra être cliqué deux fois pour faire le rechargement de l'état.

donc j'ai fini par émuler 2 clics en utilisant $timeout.

$provide.decorator('$state',
        ["$delegate", "$stateParams", '$timeout', function ($delegate, $stateParams, $timeout) {
            $delegate.forceReload = function () {
                var reload = function () {
                    $delegate.transitionTo($delegate.current, angular.copy($stateParams), {
                        reload: true,
                        inherit: true,
                        notify: true
                    })
                };
                reload();
                $timeout(reload, 100);
            };
            return $delegate;
        }]);
2
répondu thanos panousis 2014-11-12 14:16:10

tout a échoué pour moi. La seule chose qui a fonctionné...est d'ajouter cache-view= "false" dans la vue que je veux recharger en allant vers elle.

de ce numéro https://github.com/angular-ui/ui-router/issues/582

2
répondu Hans 2015-12-25 02:57:15

je ne sais Pas pourquoi aucun de ces semblait fonctionner pour moi; celui qui l'a finalement fait, c'était:

$state.reload($state.current.name);

C'était avec un angle de 1.4.0

2
répondu BarrySW19 2016-04-19 14:25:45

j'avais plusieurs vues emboîtées et le but était de recharger une seule avec du contenu. J'ai essayé différentes approches, mais la seule chose qui a fonctionné pour moi est:

//to reload
$stateParams.reload = !$stateParams.reload; //flip value of reload param
$state.go($state.current, $stateParams);

//state config
$stateProvider
  .state('app.dashboard', {
    url: '/',
    templateUrl: 'app/components/dashboard/dashboard.tmpl.html',
    controller: 'DashboardController',
    controllerAs: 'vm',
    params: {reload: false} //add reload param to a view you want to reload
  });

dans ce cas, seule la vue nécessaire serait rechargée et la mise en cache fonctionnerait toujours.

1
répondu Dmitriy Nevzorov 2016-03-11 12:10:48

je sais qu'il y a eu un tas de réponses mais la meilleure façon que j'ai trouvé pour faire ceci sans causer un rafraîchissement pleine page est de créer un paramètre factice sur la route que je veux rafraîchir et puis quand j'appelle la route je passe dans un numéro aléatoire au paramétreur factice.

            .state("coverage.check.response", {
                params: { coverageResponse: null, coverageResponseId: 0, updater: 1 },
                views: {
                    "coverageResponse": {
                        templateUrl: "/Scripts/app/coverage/templates/coverageResponse.html",
                        controller: "coverageResponseController",
                        controllerAs: "vm"
                    }
                }
            })

et puis l'appel à cette route

$state.go("coverage.check.response", { coverageResponse: coverage, updater: Math.floor(Math.random() * 100000) + 1 });

fonctionne comme un charme et gère les résolutions.

1
répondu ewahner 2016-07-08 14:25:28

vous pouvez utiliser la réponse de @Rohan https://stackoverflow.com/a/23609343/3297761

mais si vous voulez faire chaque controller reaload après un changement de vue, vous pouvez utiliser

myApp.config(function($ionicConfigProvider) { $ionicConfigProvider.views.maxCache(0); ... }
1
répondu EduLopez 2017-05-23 12:18:33

j'ai eu ce problème qui me démolissait la tête, mon routage est lu à partir d'un fichier JSON et ensuite introduit dans une directive. Je pouvais cliquer sur un État-ui mais je ne pouvais pas recharger la page. Une de mes collègues m'a montré un petit truc pour ça.

  1. vos Données
  2. dans votre configuration d'applications Créer un État de chargement
  3. Enregistrer l'état que vous souhaitez aller dans le rootscope.
  4. Réglez votre position sur "chargement" dans votre application.run
  5. dans le contrôleur de chargement résolvez la promesse de routage et ensuite réglez l'emplacement sur votre cible prévue.

cela a fonctionné pour moi.

j'Espère que ça aide

0
répondu Evan Burbidge 2016-05-25 22:06:23

si vous utilisez ionic v1, la solution ci-dessus ne fonctionnera pas car ionic a activé la mise en cache de template dans le cadre de $ionicConfigProvider.

travailler autour pour cela est un peu hacky - vous devez mettre cache à 0 dans ionic.anguleux.fichier js:

$ionicConfigProvider.views.maxCache(0);
0
répondu Maksood 2017-08-11 00:25:50