Come ricaricare lo stato attuale?


333

Sto usando Angular UI Router e vorrei ricaricare lo stato corrente e aggiornare tutti i dati / rieseguire i controller per lo stato corrente e il relativo genitore.

Ho 3 livelli di stato: directory.organisations.details

directory.organisations contiene una tabella con un elenco di organizzazioni. Facendo clic su un elemento nella tabella, si carica directory.organisations.details con $ StateParams che passa l'ID dell'elemento. Quindi nello stato dei dettagli carico i dettagli per questo elemento, li modifico e quindi salvo i dati. Tutto bene finora.

Ora devo ricaricare questo stato e aggiornare tutti i dati.

Ho provato:

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

Il che va allo stato genitore ma non ricarica il controller, immagino perché il percorso non è cambiato. Idealmente, voglio solo rimanere nello stato directory.organisations.details e aggiornare anche tutti i dati nel genitore.

Ho anche provato:

$state.reload()

Ho visto questo sull'API WIKI per $ state.reload "(bug con i controller che si stanno reintegrando in questo momento, risolvendo presto)."

Qualsiasi aiuto sarebbe apprezzato?


7
Ho risolto questo problema nel modo seguente: $ state.transitionTo ($ state.current, $ stateParams, {ricaricare: vero, ereditare: falso, notifica: vero});
Holland Risley,

1
dove aggiungere questo codice?
Manoj G,

Quindi il bug è stato corretto in questo momento? github.com/angular-ui/ui-router/wiki/…
jchnxu,

Dove dovrebbe $state.transitionTo($state.current, $stateParams, {reload:true, inherit:false})essere aggiunto il codice ? Avere questo stesso problema con il mio stato di ricarica sta perdendo tutti i dati.
Evan Burbidge,

Risposte:


565

Ho scoperto che questo è il modo di lavorare più breve per aggiornare con ui-router:

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

Aggiornamento per le versioni più recenti:

$state.reload();

Quale è un alias per:

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

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


21
Probabilmente vale la pena notare che nessuno di questi in realtà ricarica anche la pagina. Se vuoi ricaricare lo stato E la pagina, non esiste un ui-routermetodo per farlo, credo. Fare window.location.reload(true).
Semplicemente il

15
@SimpleAsCouldBe se volessi essere più angolare al riguardo potresti farlo $window.location.reload();. Anche se questo sembra un po 'eccessivo, potrebbe rendere il test / deridere / conoscere tutte le dipendenze di un pezzo di codice rende le cose un po' più facili.
bordi

1
Solo curioso, che cosa significa esattamente "$ state.current"? Non riesco a vedere spiegazioni chiare sull'API di ui-router, qualsiasi aiuto sarà apprezzato, grazie!
user2499325

3
@ user2499325: $ state.current restituisce un oggetto con tutti i dati che hai in te stateProvider: `` `{url:" / place /: placeId ", controller:" NewPlaceController ", controllerAs:" placeVM ", templateUrl:" posti /new.place/new.place.details.html ", nome:" index.places.placeDetails "}` ``
Xavier Haniquaut

1
Puoi sostituire {} con $ stateParams se hai già i parametri caricati come tali: $ state.go ($ state.current, $ stateParams, {reload: true});
Tsuz,

154

Questa soluzione funziona in AngularJS V.1.2.2:

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

8
Dove lo aggiungerebbe in modo che non causi un ciclo infinito?
Pathsofdesign

5
Ciò risolverà nuovamente gli resolveelementi dello stato?
TheSharpieOne,

7
Inoltre, non dovrai iniettare $ stateParams se cambi quella chiamata in $ state.params
Jeff Ancel

4
Funziona molto meglio dell'attuale risposta più votata, in realtà ricarica la pagina. Se hai il problema del ciclo infinito, la tua ricarica è probabilmente nel posto sbagliato. Lo sto usando solo con un clic sul pulsante
Dan

2
Un po 'in ritardo per @ManojG ma inseriresti questo codice ovunque ti serva per forzare un ricaricamento, magari in una funzione direttiva ng-click o altro evento. Non dovrebbe essere fatto ad ogni caricamento della pagina per ovvi motivi (loop infinito)
sricks

68

Questa sarebbe la soluzione finale. (ispirato al post di @ 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;
    });
});

Ora, ogni volta che devi ricaricare, chiama semplicemente:

$state.forceReload();

6
inifinit loop of death
CS

6
Sembra che tu abbia un intercettore da qualche parte che viene attivato. Ho provato questa soluzione diverse volte e funziona benissimo.
MK,

2
@MK Grazie per quella nota. Mi ha guidato verso la soluzione del mio problema diverso. Ho passato ore a cercare di scoprire perché le mie richieste venivano raddoppiate, quindi triplicate ecc. Ed era tutto a causa di un intercettore ( github.com/witoldsz/angular-http-auth ).
Maciej Gurban,

57

per quadro ionico

$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


Funziona bene per me dove $state.gonon sono riuscito a reindirizzare a uno stato nuovo. Grazie @RouR. Mi ha salvato la giornata.
Guillaume Wuip,

Penso che sostituisca $ state.go con $ state.transitionTo. Quindi, ovunque tu stia chiamando $ state.go, basta sostituirlo. Potrebbe assomigliare a $ state.transitionTo ('nome-tab', {chiave: valore}, {ricarica: vero, eredita: vero, notifica: vero}
Bill Pope,

2
cache: false fa il trucco .. ma quanto influisce sulle prestazioni?
FrEaKmAn

cambia $ state.go con $ state.transitionPer cambiare stato e ricaricare @ManojG
Gery

Devo includere alcune nuove librerie da usare $state? Sto correndo ionico 1.4.0, angolare 1.5.3
josinalvo

45

Probabilmente l'approccio più pulito sarebbe il seguente:

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

Possiamo ricaricare lo stato solo dal codice HTML.


7
Puoi anche usare ui-sref-opts = "{reload: 'child.state'}" per evitare di ricaricare l'intera pagina, dove 'child.state' è una stringa che rappresenta il tuo stato attuale.
Michael Fulton,


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

13
$scope.reloadstat = function () { $state.go($state.current, {}, {reload: true}); };

7

se vuoi ricaricare l'intera pagina, come sembra, basta iniettare $ window nel controller e quindi chiamare

$window.location.href = '/';

ma se vuoi solo ricaricare la tua vista corrente, iniettare $ scope, $ state e $ stateParams (quest'ultimo nel caso in cui tu abbia bisogno di cambiare alcuni parametri in questo prossimo caricamento, qualcosa come il tuo numero di pagina), quindi chiamalo all'interno di qualsiasi metodo del controller:

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

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


6

Soluzione sciocca che funziona sempre.

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

3

Per angolare v1.2.26, nessuna delle precedenti funzioni. Un ng-click che chiama i metodi di cui sopra dovrà essere cliccato due volte per poter ricaricare lo stato.

Così ho finito per emulare 2 clic 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;
        }]);

Navigation.reload () ha richiesto due clic con Angular 1.3.0-rc0, ma la transizione To () ha funzionato bene. Forse prova ad aggiornare se hai questo problema
sricks


3

Non sono sicuro del motivo per cui nessuno di questi sembrava funzionare per me; quello che alla fine lo fece fu:

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

Questo era con Angular 1.4.0


2

Avevo più visualizzazioni nidificate e l'obiettivo era ricaricare solo una con i contenuti. Ho provato approcci diversi ma l'unica cosa che ha funzionato per me è:

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

In questo caso verrà ricaricata solo la vista necessaria e la memorizzazione nella cache continuerebbe a funzionare.


ricaricare vero o falso, hai indicato come falso. false ricaricherà il contenuto con le ultime modifiche?
deadend il

2

So che ci sono state un sacco di risposte, ma il modo migliore che ho trovato per farlo senza causare un aggiornamento della pagina intera è creare un parametro fittizio sulla rotta che voglio aggiornare e poi quando chiamo la rotta che passo in un numero casuale per il parametro fittizio.

            .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 quindi la chiamata a quel percorso

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

Funziona come un incantesimo e gestisce le risoluzioni.



2

Se si utilizza ionic v1, la soluzione di cui sopra non funzionerà poiché ionic ha abilitato la memorizzazione nella cache dei modelli come parte di $ ionicConfigProvider.

Per ovviare a questo è un po 'confuso - devi impostare la cache su 0 nel file ionic.angular.js:

$ionicConfigProvider.views.maxCache(0);

1

Ho avuto questo problema che mi stava rovinando la testa, il mio instradamento viene letto da un file JSON e quindi inserito in una direttiva. Potrei fare clic su uno stato dell'interfaccia utente ma non riesco a ricaricare la pagina. Quindi un mio collega mi ha mostrato un bel giochino per questo.

  1. Ottieni i tuoi dati
  2. Nella tua app config crea uno stato di caricamento
  3. Salva lo stato in cui vuoi andare nel rootcope.
  4. Imposta la tua posizione su "/ caricamento" in app.run
  5. Nel controller di caricamento risolvi la promessa di routing e quindi imposta la posizione sul target desiderato.

Questo ha funzionato per me.

Spero che sia d'aiuto

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.