Recarregando estado atual – atualizar dados

Estou usando o Angular UI Router e gostaria de recarregar o estado atual e atualizar todos os dados / reexecutar os controladores para o estado atual e seu pai.

Eu tenho 3 níveis de estado: directory.organisations.details

directory.organisations contém uma tabela com uma lista de organizações. Clicar em um item na tabela carrega directory.organisations.details com $ StateParams passando o ID do item. Então, no estado de detalhes, eu carrego os detalhes desse item, edito-os e depois salvo dados. Tudo bem até agora.

Agora preciso recarregar esse estado e atualizar todos os dados.

Eu tentei:

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

Que vai para o estado pai, mas não recarrega o controlador, eu acho que o caminho não mudou. Idealmente, eu só quero ficar no estado directory.organisations.details e atualizar todos os dados no pai também.

Eu também tentei:

 $state.reload() 

Eu já vi isso no API WIKI para $ state.reload “(bug com os controllers reinstantiando agora, consertando em breve).”

Qualquer ajuda seria apreciada?

Eu encontrei este para ser o caminho mais curto de trabalho para atualizar com o roteador ui:

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

Atualização para versões mais recentes:

 $state.reload(); 

Qual é um alias para:

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

Documentação: https://angular-ui.github.io/ui-router/site/#/api/ui.router.state.$state#methods_reload

Esta solução funciona no AngularJS V.1.2.2:

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

Essa seria a solução final. (inspirado pelo post do @ 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; }); }); 

Agora, sempre que precisar recarregar, basta ligar:

 $state.forceReload(); 

para estrutura iônica

 $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

Provavelmente, a abordagem mais limpa seria a seguinte:

 Details State 

Podemos recarregar o estado apenas do HTML.

A resposta do @Holland Risley agora está disponível como uma API no ui-router mais recente.

 $state.reload(); 

Um método que força recarrega o estado atual. Todas as resoluções são resolvidas novamente, os controladores são reinstantados e os events são reativados.

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

se você quiser recarregar toda a página, como parece, basta injetar $ window no seu controlador e depois chamar

 $window.location.href = '/'; 

mas se você quiser apenas recarregar sua visão atual, injete $ scope, $ state e $ stateParams (o último caso você precise alterar alguns parâmetros neste próximo recarregamento, algo como o seu número de página), então chame isso dentro de qualquer método do controlador:

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

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

Solução tola que sempre funciona.

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

Para v1.2.26 angular, nenhum dos trabalhos acima. Um ng-click que chame os methods acima terá que ser clicado duas vezes para fazer o estado recarregar.

Então acabei emulando 2 cliques 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; }]); 

Tudo falhou para mim. A única coisa que funcionou … é adicionar cache-view = “false” na visão que eu quero recarregar quando for para ele.

desta edição https://github.com/angular-ui/ui-router/issues/582

Não tenho certeza por que nada disso parecia funcionar para mim; o que finalmente fez foi:

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

Isso foi com o Angular 1.4.0

Eu tinha várias visualizações aninhadas e o objective era recarregar apenas uma com conteúdo. Eu tentei abordagens diferentes, mas a única coisa que funcionou para mim é:

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

Nesse caso, somente a visualização necessária seria recarregada e o armazenamento em cache ainda funcionaria.

Eu sei que houve um monte de respostas, mas a melhor maneira que eu encontrei para fazer isso sem causar uma atualização de página inteira é criar um parâmetro fictício na rota que eu quero atualizar e, em seguida, quando eu chamo a rota que eu passo em um número random para o parâmetro dummy.

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

e, em seguida, a chamada para essa rota

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

Funciona como um encanto e lida com as resoluções.

Você pode usar o @Rohan answer https://stackoverflow.com/a/23609343/3297761

Mas se você quiser fazer cada controlador reaload após uma mudança de visão, você pode usar

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

Eu tive esse problema que estava destruindo minha cabeça, meu roteamento é lido de um arquivo JSON e, em seguida, inserido em uma diretiva. Eu poderia clicar em um estado de ui, mas não consegui recarregar a página. Então um colega meu me mostrou um pequeno truque para isso.

  1. Obtenha seus dados
  2. Na sua configuração de aplicativos, crie um estado de carregamento
  3. Salve o estado que você quer ir no rootscope.
  4. Defina a sua localização para “/ loading” na sua app.run
  5. No controlador de carregamento, resolva a promise de roteamento e defina o local para o destino pretendido.

Isso funcionou para mim.

Espero que ajude

Se você estiver usando o iônico v1, a solução acima não funcionará, já que o iônico ativou o cache de modelo como parte do $ ionicConfigProvider.

Uma solução para isso é um pouco hacky – você precisa definir o cache como 0 no arquivo ionic.angular.js:

 $ionicConfigProvider.views.maxCache(0);