J'utilise Angular UI Router et je voudrais recharger l'état actuel et actualiser toutes les données/réexécuter les contrôleurs pour l'état actuel et son parent.
J'ai 3 niveaux d'état: directory.organisations.details
directory.organisations contient un tableau avec une liste d'organisations. Cliquer sur un élément de la table charge directory.organisations.details avec $ StateParams en transmettant l'ID de l'élément. Donc, dans l'état de détails, je charge les détails de cet élément, les édite, puis enregistre les données. Tout va bien jusqu'à présent.
Maintenant, je dois recharger cet état et actualiser toutes les données.
J'ai essayé:
$state.transitionTo('directory.organisations');
Ce 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 souhaite simplement rester dans l'état directory.organisations.details et actualiser toutes les données du parent.
J'ai aussi essayé:
$state.reload()
J'ai vu cela sur l'API WIKI pour $ state.reload "(bug avec les contrôleurs remontant à l'heure actuelle, en train de se réparer bientôt)."
Toute aide serait appréciée?
Cette solution fonctionne dans AngularJS V.1.2.2:
$state.transitionTo($state.current, $stateParams, {
reload: true,
inherit: false,
notify: true
});
J'ai trouvé que c'était le moyen le plus rapide d'actualiser avec ui-router:
$state.go($state.current, {}, {reload: true}); //second parameter is for $stateParams
Mettre à jour pour les versions les 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.$state#methods_reload
Ce serait la solution finale. (inspiré par le post 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, appelez simplement:
$state.forceReload();
pour ionic framework
$state.transitionTo($state.current, $state.$current.params, { reload: true, inherit: true, notify: true });//reload
$stateProvider.
state('home', {
url: '/',
cache: false, //required
L'approche plus propre serait probablement 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 uniquement.
La réponse de @Holland Risley est maintenant disponible en tant qu'API dans le dernier routeur ui.
$state.reload();
Une méthode qui force recharge l'état actuel. Toutes les résolutions sont re-résolues, les contrôleurs réinitialisés et les événements rediffusés.
http://angular-ui.github.io/ui-router/site/#/api/ui.router.state.$state
$state.go($state.current, $stateParams, {reload: true, inherit: false});
$scope.reloadstat = function () { $state.go($state.current, {}, {reload: true}); };
si vous voulez recharger toute votre page, comme cela semble être le cas, injectez simplement $ window dans votre contrôleur puis appelez
$window.location.href = '/';
mais si vous voulez seulement recharger votre vue actuelle, injectez $ scope, $ state et $ stateParams (ce dernier au cas où vous auriez besoin de modifier certains paramètres lors de ce prochain rechargement, comme votre numéro de page), puis appelez-le dans n'importe quel type. méthode du contrôleur:
$stateParams.page = 1;
$state.reload();
AngularJS v1.3.15 angular-ui-router v0.2.15
Contournement idiot qui fonctionne toujours.
$state.go("otherState").then(function(){
$state.go("wantedState")
});
Tout a échoué pour moi. La seule chose qui a fonctionné ... est d'ajouter cache-view = "false" dans la vue que je veux recharger lorsque je vais y accéder.
à partir de ce numéro https://github.com/angular-ui/ui-router/issues/582
Je ne sais pas pourquoi aucune de ces solutions ne semble fonctionner pour moi. celui qui l'a finalement fait:
$state.reload($state.current.name);
C'était avec Angular 1.4.0
Pour angular v1.2.26, aucune des solutions ci-dessus ne fonctionne. Un ng-click appelant les méthodes ci-dessus devra être cliqué deux fois pour rendre l'état rechargé.
J'ai donc 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;
}]);
Vous pouvez utiliser la réponse @Rohan https://stackoverflow.com/a/23609343/3297761
Mais si vous voulez rendre chaque contrôleur réel après un changement de vue, vous pouvez utiliser
myApp.config(function($ionicConfigProvider) { $ionicConfigProvider.views.maxCache(0); ... }
J'avais plusieurs vues imbriquées et l'objectif é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.
Si vous utilisez ionic v1, la solution ci-dessus ne fonctionnera pas car ionic a activé la mise en cache des modèles dans le cadre de $ ionicConfigProvider.
La solution est un peu compliquée - vous devez définir le cache sur 0 dans le fichier ionic.angular.js:
$ionicConfigProvider.views.maxCache(0);
Je sais qu'il y a eu beaucoup de réponses, mais la meilleure façon de le faire sans provoquer un rafraîchissement complet de la page est de créer un paramètre factice sur la route que je souhaite actualiser, puis lorsque j'appelle la route par laquelle je passe. nombre aléatoire au paramètre 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"
}
}
})
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.
J'ai eu ce problème, il me déchirait la tête, mon routage est lu à partir d'un fichier JSON, puis introduit dans une directive. Je pouvais cliquer sur un état, mais je ne pouvais pas recharger la page. Donc, un de mes collègues m'a montré un joli petit truc pour ça.
Cela a fonctionné pour moi.
J'espère que ça aide