Jak ponownie załadować aktualny stan?


333

Używam routera Angular UI i chciałbym ponownie załadować bieżący stan i odświeżyć wszystkie dane / ponownie uruchomić kontrolery dla bieżącego stanu i jego rodzica.

Mam 3 poziomy stanu: directory.organisations.details

Directory.organisations zawiera tabelę z listą organizacji. Kliknięcie elementu w tabeli powoduje załadowanie directory.organisations.details z $ StateParams przekazującym identyfikator elementu. Więc w stanie szczegółów ładuję szczegóły tego elementu, edytuję je, a następnie zapisuję dane. Jak dotąd wszystko w porządku.

Teraz muszę ponownie załadować ten stan i odświeżyć wszystkie dane.

Próbowałem:

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

Który przechodzi do stanu nadrzędnego, ale nie ładuje ponownie kontrolera, ponieważ ścieżka się nie zmieniła. Idealnie chcę po prostu pozostać w stanie directory.organisations.details i odświeżyć wszystkie dane w obiekcie nadrzędnym.

Próbowałem też:

$state.reload()

Widziałem to na interfejsie API WIKI dla $ state.reload „(błąd przywracania kontrolerów teraz, naprawiony wkrótce)”.

Każda pomoc byłaby mile widziana?


7
Rozwiązałem to w następujący sposób: $ state.transitionTo ($ state.current, $ stateParams, {reload: true, dziedziczenie: false, powiadomienie: true});
Holland Risley,

1
gdzie dodać ten kod?
Manoj G

Więc błąd został naprawiony teraz? github.com/angular-ui/ui-router/wiki/…
jchnxu

Gdzie należy $state.transitionTo($state.current, $stateParams, {reload:true, inherit:false})dodać kod ? Mając ten sam problem z przeładowaniem moich stanów, tracę wszystkie dane.
Evan Burbidge

Odpowiedzi:


565

Odkryłem, że jest to najkrótszy działający sposób na odświeżenie za pomocą interfejsu użytkownika:

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

Aktualizacja dla nowszych wersji:

$state.reload();

Który jest aliasem dla:

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

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


21
Prawdopodobnie warto zauważyć, że żadne z nich nie przeładowuje również strony. Jeśli chcesz ponownie załadować stan ORAZ stronę, nie ma ui-routerna to metody. Zrobić window.location.reload(true).
SimplGy

15
@SimpleAsCouldBe, jeśli chcesz być bardziej zaangażowany, możesz to zrobić $window.location.reload();. Chociaż wydaje się to trochę przesadne, może sprawić, że testowanie / kpowanie / znajomość wszystkich zależności jest częścią kodu, jest trochę łatwiejsze.
edhedges

1
Ciekawe, co dokładnie oznacza „$ state.current”? Nie widzę jasnych wyjaśnień na temat interfejsu API interfejsu użytkownika routera, każda pomoc będzie mile widziana, dzięki!
user2499325

3
@ user2499325: $ state.current zwraca obiekt ze wszystkimi danymi, które masz w stanie stateProvider: `` {url: "/ place /: placeId", kontroler: "NewPlaceController", controllerAs: "placeVM", templateUrl: "places /new.place/new.place.details.html ”, nazwa:„ index.places.placeDetails ”}` `
Xavier Haniquaut

1
Możesz zamienić {} na $ stateParams, jeśli masz już takie parametry: $ state.go ($ state.current, $ stateParams, {reload: true});
tsuz

154

To rozwiązanie działa w AngularJS V.1.2.2:

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

8
Gdzie byś to dodał, żeby nie spowodowała nieskończonej pętli?
Pathsofdesign

5
Czy to rozwiąże resolveelementy stanu?
TheSharpieOne

7
Ponadto nie będziesz musiał wstrzykiwać $ stateParams, jeśli zmienisz to wywołanie na $ state.params
Jeff Ancel

4
Działa znacznie lepiej niż obecnie najwyższa głosowana odpowiedź, w rzeczywistości ładuje stronę ponownie. Jeśli masz problem z nieskończoną pętlą, przeładowanie jest prawdopodobnie w niewłaściwym miejscu. Używam go tylko po kliknięciu przycisku
Dan

2
Trochę za późno na @ManojG, ale umieściłbyś ten kod gdziekolwiek będziesz musiał wymusić przeładowanie - być może w funkcji dyrektywy ng-click lub w innym zdarzeniu. Nie powinno się tego robić przy każdym ładowaniu strony z oczywistych powodów (nieskończona pętla)
sricks

68

To byłoby ostateczne rozwiązanie. (zainspirowany postem @ 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;
    });
});

Teraz, ilekroć musisz przeładować, po prostu zadzwoń:

$state.forceReload();

6
nieskończona pętla śmierci
CS

6
Wygląda na to, że masz gdzieś przechwytywacz, który się uruchamia. Testowałem to rozwiązanie kilka razy i działa dobrze.
MK

2
@MK Dziękuję za tę notatkę. Poprowadził mnie do rozwiązania mojego własnego, innego problemu. Spędziłem godziny próbując dowiedzieć się, dlaczego moje żądania zostały podwojone, a następnie trzykrotnie itd., A wszystko to z powodu przechwytywacza ( github.com/witoldsz/angular-http-auth ).
Maciej Gurban,

57

dla szkieletu jonowego

$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


Działa dobrze dla mnie, gdy $state.gonie udało się przekierować do nowego stanu. Dzięki @RouR. Uratowałem mój dzień.
Guillaume Wuip,

Myślę, że zamień $ state.go na $ state.transitionTo. Gdziekolwiek dzwoniłeś do $ state.go, po prostu zamień to. Może to wyglądać podobnie do $ state.transitionTo ('tab-name', {key: value}, {reload: true, dziedziczenie: true, powiadom: true}
Bill Pope

2
cache: false robi lewę… ale ile to wpływa na wydajność?
FrEaKmAn

zmień $ state.go za pomocą $ state.transition Aby zmienić stan i ponownie załadować @ManojG
Gery

Czy muszę dołączyć nową bibliotekę do użycia $state?
Korzystam

45

Prawdopodobnie czystsze podejście byłoby następujące:

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

Możemy przeładować stan tylko z HTML.


7
Możesz także użyć ui-sref-opts = "{reload: 'child.state'}", aby uniknąć przeładowania całej strony, gdzie „child.state" jest łańcuchem reprezentującym twój aktualny stan.
Michael Fulton




7

jeśli chcesz ponownie załadować całą stronę, jak się wydaje, po prostu wstrzyknij $ window do kontrolera, a następnie zadzwoń

$window.location.href = '/';

ale jeśli chcesz przeładować tylko bieżący widok, wstrzyknij $ scope, $ state i $ stateParams (ten ostatni na wypadek, gdybyś musiał zmienić parametry w nadchodzącym przeładowaniu, coś w rodzaju numeru strony), a następnie wywołaj to w dowolnym metoda kontrolera:

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

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


6

Głupie obejście, które zawsze działa.

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

3

W przypadku wersji kątowej 1.2.26 żadna z powyższych nie działa. Kliknięcie ng, które wywołuje powyższe metody, musi zostać dwukrotnie kliknięte , aby stan został ponownie załadowany.

Ostatecznie emulowałem 2 kliknięcia za pomocą $ 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 () wymagało dwóch kliknięć w Angular 1.3.0-rc0, ale przejścieTo () działało dobrze. Być może spróbuj
zaktualizować,


3

Nie jestem pewien, dlaczego żadne z nich nie działało dla mnie; tym, który w końcu to zrobił:

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

Tak było w przypadku Angulara 1.4.0


2

Miałem wiele zagnieżdżonych widoków, a celem było ponowne załadowanie tylko jednego z zawartością. Próbowałem różnych podejść, ale jedyna rzecz, która działała dla mnie, to:

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

W takim przypadku tylko potrzebny widok zostałby ponownie załadowany, a buforowanie nadal działałoby.


przeładuj prawdę lub fałsz, wspomniany jako fałsz. false przeładuje zawartość z najnowszymi zmianami?
deadend

2

Wiem, że było wiele odpowiedzi, ale najlepszym sposobem, jaki udało mi się to zrobić bez powodowania pełnego odświeżenia strony, jest utworzenie fikcyjnego parametru na trasie, którą chcę odświeżyć, a następnie, gdy wywołuję trasę, podaję losowa liczba do manekina.

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

a następnie połączenie z tą trasą

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

Działa jak urok i obsługuje postanowienia.



2

Jeśli używasz ionic v1, powyższe rozwiązanie nie będzie działać, ponieważ ionic włączył buforowanie szablonów jako część $ ionicConfigProvider.

Obejście tego jest trochę hacky - musisz ustawić pamięć podręczną na 0 w pliku ionic.angular.js:

$ionicConfigProvider.views.maxCache(0);

1

Miałem ten problem, że rujnował mi głowę, moje trasy są odczytywane z pliku JSON, a następnie wprowadzane do dyrektywy. Mogłem kliknąć stan interfejsu użytkownika, ale nie mogłem ponownie załadować strony. Więc mój kolega pokazał mi niezłą sztuczkę.

  1. Uzyskaj swoje dane
  2. W konfiguracji aplikacji utwórz stan ładowania
  3. Zapisz stan, w którym chcesz przejść, w głównym katalogu.
  4. Ustaw swoją lokalizację na „/ loading” w app.run
  5. W kontrolerze ładowania sprawdź obietnicę routingu, a następnie ustaw lokalizację zgodnie z zamierzonym celem.

To zadziałało dla mnie.

Mam nadzieję, że to pomoże

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.