Recargar el estado actual – actualizar datos

Estoy usando Angular UI Router y me gustaría volver a cargar el estado actual y actualizar todos los datos / volver a ejecutar los controladores para el estado actual y su padre.

Tengo 3 niveles estatales: directory.organisations.details

directory.organisations contiene una tabla con una lista de organizaciones. Al hacer clic en un elemento de la tabla se carga el directorio.organisations.details con $ StateParams que pasa el ID del elemento. Entonces, en el estado de detalles, cargo los detalles de este artículo, los edito y luego guardo los datos. Todo bien hasta ahora.

Ahora necesito volver a cargar este estado y actualizar todos los datos.

Yo he tratado:

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

Lo cual va al estado padre pero no recarga el controlador, supongo porque la ruta no ha cambiado. Idealmente, solo quiero permanecer en el directorio. Organisations.details state y actualizar todos los datos en el padre también.

También he intentado:

 $state.reload() 

Lo he visto en API WIKI para $ state.reload “(error con la reinstalación de los controladores en este momento, arreglando pronto).”

¿Cualquier ayuda sería apreciada?

Descubrí que esta es la forma más corta de actualizar el ui-router:

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

Actualización para versiones más nuevas:

 $state.reload(); 

¿Cuál es un alias para:

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

Documentación: https://angular-ui.github.io/ui-router/site/#/api/ui.router.state.$state#methods_reload

Esta solución funciona en AngularJS V.1.2.2:

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

Esa sería la solución final. (inspirado en la publicación 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; }); }); 

Ahora, cuando necesite recargar, simplemente llame:

 $state.forceReload(); 

para el ionic framework

 $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

Probablemente el enfoque más limpio sería el siguiente:

 Details State 

Podemos recargar el estado solo desde el HTML.

La respuesta de @Holland Risley ahora está disponible como una API en el último ui-enrutador.

 $state.reload(); 

Un método que fuerza vuelve a cargar el estado actual. Todos los resuelve se vuelven a resolver, los controladores se vuelven a instalar y los eventos se reinician.

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 quieres volver a cargar toda tu página, como parece, simplemente inyecta $ window en tu controlador y luego llama

 $window.location.href = '/'; 

pero si solo quieres volver a cargar tu vista actual, ingresa $ scope, $ state y $ stateParams (este último solo en caso de que necesites cambiar algunos parámetros en esta próxima recarga, algo así como tu número de página), luego llama a este dentro de cualquier método del controlador:

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

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

Una tonta solución que siempre funciona.

 $state.go("otherState").then(function(){ $state.go("wantedState") }); 

Para angular v1.2.26, ninguno de los anteriores funciona. Un clic ng que llame a los métodos anteriores tendrá que hacer clic dos veces para volver a cargar el estado.

Así que terminé emulando 2 clics usando $ 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; }]); 

Todo falló para mí. Lo único que funcionó … es agregar cache-view = “false” a la vista que quiero volver a cargar cuando voy a ella.

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

No estoy seguro de por qué ninguno de estos pareció funcionar para mí; el que finalmente lo hizo fue:

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

Esto fue con Angular 1.4.0

Tenía varias vistas anidadas y el objective era volver a cargar solo una con contenido. Probé diferentes enfoques, pero lo único que funcionó para mí es:

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

En este caso, solo se volvería a cargar la vista necesaria y el almacenamiento en caché seguiría funcionando.

Sé que ha habido un montón de respuestas, pero la mejor manera que he encontrado para hacer esto sin causar una actualización de página completa es crear un parámetro ficticio en la ruta que quiero actualizar y luego cuando llamo a la ruta paso en una número aleatorio para el parámetro ficticio.

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

y luego la llamada a esa ruta

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

Funciona como un encanto y maneja los resuelve.

Puede usar @Rohan answer https://stackoverflow.com/a/23609343/3297761

Pero si desea hacer que cada controlador se actualice después de un cambio de vista, puede usar

 myApp.config(function($ionicConfigProvider) { $ionicConfigProvider.views.maxCache(0); ... } 

Tuve este problema, me estaba destrozando la cabeza, mi enrutamiento se leyó de un archivo JSON y luego entró en una directiva. Podría hacer clic en un estado ui pero no podría volver a cargar la página. Entonces un colega mío me mostró un buen truco para eso.

  1. Obtenga sus datos
  2. En la configuración de tus aplicaciones crea un estado de carga
  3. Guarde el estado al que desea ir en el rootscope.
  4. Configura tu ubicación en “/ cargando” en tu app.run
  5. En el controlador de carga, resuelva la promesa de enrutamiento y luego configure la ubicación para su objective deseado.

Esto funcionó para mí.

Espero eso ayude

Si usa v1 iónico, la solución anterior no funcionará, ya que iónica ha habilitado el caché de plantillas como parte de $ ionicConfigProvider.

Trabajar para eso es un poco raro: tienes que establecer el caché en 0 en el archivo ionic.angular.js:

 $ionicConfigProvider.views.maxCache(0);