Mevcut durum nasıl yeniden yüklenir?


333

Açısal UI Router kullanıyorum ve mevcut durumu yeniden yüklemek ve tüm verileri yenilemek / mevcut durum ve onun üst için denetleyicileri yeniden çalıştırmak istiyorum.

3 eyalet seviyem var: directory.organisations.details

directory.organisations , kuruluşların listesini içeren bir tablo içerir. Tablodaki bir öğeye tıklandığında directory.organisations.de yüklenir ve $ StateParams öğenin kimliğini geçer. Ayrıntılar durumunda, bu öğenin ayrıntılarını yüklerim, düzenler ve verileri kaydederim. Şimdiye kadar her şey yolunda.

Şimdi bu durumu yeniden yüklemem ve tüm verileri yenilemem gerekiyor.

Denedim:

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

Hangi üst duruma gider ama denetleyiciyi yeniden yüklemez, sanırım yol değişmedi. İdeal olarak sadece içinde kalmak istiyorum directory.organisations.details ve ebeveyn de tüm verileri yenilemek .

Ayrıca denedim:

$state.reload()

Bunu $ state.reload için API WIKI'de gördüm "(şu anda eski haline döndüren denetleyicilere sahip hata, yakında düzeltiliyor)."

Herhangi bir yardım mutluluk duyacağız?


7
Bunu şu şekilde çözdüm: $ state.transitionTo ($ state.current, $ stateParams, {yeniden yükle: true, inherit: false, notify: true});
Holland Risley

1
bu kodu nereye ekleyebilirim?
Manoj G

Yani hata şu anda düzeltildi mi? github.com/angular-ui/ui-router/wiki/…
jchnxu

Kod nereye eklenmelidir $state.transitionTo($state.current, $stateParams, {reload:true, inherit:false})? Durumlarımı yeniden yükleme ile aynı sorunu olması tüm verileri kaybediyor.
Evan Burbidge

Yanıtlar:


565

Ben ui-yönlendirici ile yenilemek için en kısa çalışma yolu olarak buldum:

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

Daha yeni sürümler için güncelleme :

$state.reload();

Hangisi için bir takma addır:

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

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


21
Muhtemelen bunların hiçbirinin aslında sayfayı yeniden yüklemediğini belirtmek gerekir. Durumu VE sayfayı yeniden yüklemek istiyorsanız, bunun için bir ui-routeryöntem olduğunu düşünüyorum. Yap window.location.reload(true).
SimplGy

15
@BasitAsCouldBe daha açısal olmak istersen yapabilirsin $window.location.reload();. Bu biraz abartılı görünse de, tüm bağımlılıkları test etmeyi / alay etmeyi / tanımayı bir parça kodun biraz daha kolay hale getirebilir.
edhedges

1
Sadece merak ediyorum, "$ state.current" tam olarak ne anlama geliyor? Ui-router'ın API'sı hakkında net açıklamalar göremiyorum, herhangi bir yardım takdir edilecektir, teşekkürler!
user2499325

3
@ user2499325: $ state.current, içinde bulunduğunuz tüm verileri içeren bir nesne döndürür stateProvider: `` {url: "/ place /: placeId", denetleyici: "NewPlaceController", controllerAs: "placeVM", templateUrl: " /new.place/new.place.details.html ", ad:" index.places.placeDetails "}` `
Xavier Haniquaut

1
Yüklü parametreleriniz varsa {} yerine $ stateParams kullanabilirsiniz: $ state.go ($ state.current, $ stateParams, {reload: true});
tsuz

154

Bu çözüm AngularJS V.1.2.2'de çalışır:

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

8
Sonsuz bir döngüye neden olmaması için bunu nereye eklersiniz?
Pathsofdesign

5
Bu resolve, devletin öğelerini yeniden çözecek mi?
TheSharpieOne

7
Ayrıca, bu çağrıyı $ state.params olarak değiştirirseniz $ stateParams'ı enjekte etmek zorunda kalmazsınız
Jeff

4
Mevcut en yüksek oylanan cevaptan çok daha iyi çalışır, aslında sayfayı yeniden yükler. Sonsuz döngü sorununuz varsa, yeniden yüklemeniz büyük olasılıkla yanlış yerde. Sadece bir tuşa basmakla kullanıyorum
Dan

2
@ManojG için biraz geç, ancak bu kodu yeniden yüklemeyi zorlamanız gereken herhangi bir yere koyabilirsiniz - belki bir ng-tıklama yönergesi işlevinde veya başka bir olayda. Belli nedenlerle (sonsuz döngü) her sayfa yükünde yapılmamalıdır
16'da sricks

68

Bu nihai çözüm olacaktır. (@ Hollan_Risley'nin gönderisinden esinlenmiştir)

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

Şimdi, yeniden yüklemeniz gerektiğinde, şunu aramanız yeterlidir:

$state.forceReload();

6
ölüm inifinit döngüsü
CS

6
Tetiklenen bir yerde bir önleyici var gibi görünüyor. Bu çözümü birkaç kez test ettim ve iyi çalışıyor.
MK

2
@MK Bu not için teşekkür ederim. Beni farklı sorunumun çözümüne yönlendirdi. Neden benim istekleri iki katına, sonra üçe katlanmış vb öğrenmek için saat geçirdim ve hepsi bir önleme ( github.com/witoldsz/angular-http-auth ) nedeniyle oldu .
Maciej Gurban

57

iyonik çerçeve için

$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


$state.goYeni bir duruma yönlendirilemediğinde benim için iyi çalışıyor . Teşekkürler @RouR. Günümü kurtardım.
Guillaume Wuip

Ben $ state.go yerine $ state.transitionTo ile düşünüyorum. Yani $ state.go adını her nereye çağırırsanız değiştirin. $ State.transitionTo ('tab-name', {key: value}, {reload: true, inherit: true, notify: true}
Bill Pope

2
önbellek: yanlış hile .. ama performansı ne kadar etkiler?
43

değişim devlet ve yeniden @ManojG için $ state.transitionTo ile $ state.go değiştirmek
Gery

Kullanmak için yeni bir kütüphane eklemem gerekir $statemi? İyonik 1.4.0, açısal 1.5.3 kullanıyorum
josinalvo

45

Muhtemelen daha temiz bir yaklaşım aşağıdaki gibi olacaktır:

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

Durumu yalnızca HTML'den yeniden yükleyebiliriz.


7
Tüm sayfayı yeniden yüklemekten kaçınmak için ui-sref-opts = "{reload: 'child.state'}" kullanabilirsiniz; burada 'child.state' gerçek durumunuzu temsil eden bir dizedir.
Michael Fulton



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

7

sayfanızın tamamını yeniden yüklemek istediğiniz gibi görünüyorsa, kontrol cihazınıza $ window enjekte edin ve ardından

$window.location.href = '/';

ancak yalnızca mevcut görünümünüzü yeniden yüklemek istiyorsanız, $ scope, $ state ve $ stateParams'ı (bu yaklaşan yeniden yüklemede bazı parametrelerin değiştirilmesi gerektiğinde, sayfa numaranız gibi bir şey) enjekte ediyorsanız, denetleyici yöntemi:

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

Açısal JS v1.3.15 açısal-ui-yönlendirici v0.2.15


6

Her zaman işe yarayan aptal bir çözüm.

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

3

Açısal v1.2.26 için yukarıdakilerin hiçbiri işe yaramaz. Yukarıdaki yöntemleri çağıran bir tıklamanın iki kez tıklanması gerekir yeniden yüklemek .

Bu yüzden $ timeout kullanarak 2 tıklama taklit sona erdi.

$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 (), Açısal 1.3.0-rc0 ile iki tıklama gerektirdi, ancak transitionTo () iyi çalıştı. Belki bu sorun varsa yükseltmeyi deneyin
16'da sricks


3

Bunların hiçbirinin benim için neden işe yaramadığından emin değilim; sonunda bunu yapan:

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

Bu Açısal 1.4.0 ile oldu


2

Birden çok iç içe görünümüm vardı ve amaç yalnızca bir içerikli yeniden yüklemekti. Farklı yaklaşımlar denedim ama benim için işe yarayan tek şey:

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

Bu durumda yalnızca gerekli görünüm yeniden yüklenecek ve önbellekleme yine de işe yarayacaktır.


Doğru veya yanlış yeniden yükleme, yanlış olarak belirtilen u. false, en son değişikliklerle içeriği yeniden yükler mi?
deadend

2

Bir sürü cevap olduğunu biliyorum ama tam sayfa yenilemesine neden olmadan bunu yapmanın en iyi yolu, yenilemek istediğim rotada bir kukla parametre oluşturmak ve daha sonra rotayı çağırdığımda kukla parametreye rastgele sayı.

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

ve sonra o rotaya yapılan çağrı

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

Bir cazibe gibi çalışır ve çözer.



2

İyonik v1 kullanıyorsanız, iyonik $ ionicConfigProvider'ın bir parçası olarak şablon önbelleğe almayı etkinleştirdiği için yukarıdaki çözüm çalışmaz.

Bunun için geçici bir çözüm - ionic.angular.js dosyasında önbelleği 0 olarak ayarlamanız gerekir:

$ionicConfigProvider.views.maxCache(0);

1

Bu sorunla başımı mahvettim, yönlendirmem bir JSON dosyasından okunur ve daha sonra bir direktifle beslenir. Bir kullanıcı arayüzünü tıklayabilirdim, ancak sayfayı yeniden yükleyemedim. Bu yüzden bir kolejim bana bunun için güzel bir numara gösterdi.

  1. Verilerinizi Alın
  2. Uygulama yapılandırmanızda bir yükleme durumu oluşturun
  3. Gitmek istediğiniz durumu anaç içine kaydedin.
  4. Konumunuzu app.run dosyasında "/ loading" olarak ayarlayın
  5. Yükleme denetleyicisinde yönlendirme vaadini çözün ve ardından konumu hedeflediğiniz hedefe ayarlayın.

Bu benim için çalıştı.

Umarım yardımcı olur

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.