AngularJS kullanarak sayfanın tamamını yeniden yükleme veya yeniden oluşturma


299

Tüm sayfayı birkaç kullanıcı bağlamına göre oluşturduktan ve birkaç $httpistekte bulunduktan sonra , kullanıcının bağlamları değiştirebilmesini ve her şeyi yeniden oluşturabilmesini istiyorum (tüm $httpistekleri yeniden gönderme vb.). Kullanıcıyı başka bir yere yönlendirirsem işler düzgün çalışır:

$scope.on_impersonate_success = function(response) {
  //$window.location.reload(); // This cancels any current request
  $location.path('/'); // This works as expected, if path != current_path
};

$scope.impersonate = function(username) {
  return auth.impersonate(username)
    .then($scope.on_impersonate_success, $scope.on_auth_failed);
};

Eğer kullanırsam $window.location.reload(), o zaman bir yanıt bekleyen bazı $httpistekleri auth.impersonate(username)iptal edilir, bu yüzden bunu kullanamam. Ayrıca, kesmek de $location.path($location.path())çalışmıyor (hiçbir şey olmuyor).

Tüm istekleri tekrar göndermeden sayfayı yeniden oluşturmanın başka bir yolu var mı?


Alvaro Joao'nun aşağıda söylediği gibi, bunun işe yaraması için angular-route.js kullanmanız gerekir. bennadel.com/blog/…
Yvonne Aburrow

Yanıtlar:


404

Kayıt için, açısal sayfayı geçerli sayfayı yeniden oluşturmaya zorlamak için şunları kullanabilirsiniz:

$route.reload();

AngularJS belgelerine göre :

$ Konumu değişmemiş olsa bile $ route hizmetinin geçerli yolu yeniden yüklemesine neden olur.

Sonuç olarak, ngView yeni bir kapsam oluşturur, denetleyiciyi yeniden başlatır.


6
Yorum için teşekkürler, bazı nedenlerden dolayı $route.reload()normal bir yenileme ile karşılaştırıldığında kullandığımda biraz farklı davranışlar görüyorum . Örneğin, bir sekme başlangıçta yenilemede gösterilecek şekilde ayarlanmıştır, ancak yeniden yükleme yöntemi sekmeyi ayarlamadan sayfayı yeniden yüklediğinde sorunun ne olduğundan emin değilsiniz.
Doug Molineux

2
Bu filtreleri / hizmetleri de çalıştırıyor mu? İstenmeyen kalıcı duruma gelmek. Düzenleme: Soruyu doğru cevaplamak için hala yükseltildi ve bu süper yararlı. Eğer ederiz
hibe

10
$routeBunun çalışması için kontrolöre enjekte etmeyi unutmayın .
Neel

6
@ alphapilgrim ngRoute modülü artık çekirdeğin parçası değil angular.js file. Kullanmaya devam $routeProviderediyorsanız, şimdi angular-route.jsHTML'nize eklemeniz gerekir :
Alvaro Joao

3
stateProvider
Lalit Rao

314

$route.reload()denetleyicileri yeniden başlatır, ancak hizmetleri yeniden başlatır. Başvurunuzun tüm durumunu sıfırlamak istiyorsanız şunları kullanabilirsiniz:

$window.location.reload();

Bu, $ window hizmetini enjekte etmeye erişebileceğiniz standart bir DOM yöntemidir .

Sayfayı sunucudan yeniden yüklediğinizden emin olmak istiyorsanız, örneğin Django veya başka bir web çerçevesi kullanırken ve yeni bir sunucu tarafı oluşturma istiyorsanız , dokümanlarda açıklandığı truegibi bir parametre reloadolarak iletin . Bu, sunucu ile etkileşim gerektirdiğinden, daha yavaş olacaktır, bu yüzden yalnızca gerektiğinde yapın

Açısal 2

Yukarıdaki ben Açısal 2 kullanmıyorum açısal 1. uygulanır, hizmetleri gibi görünüyor, orada orada farklıdır Router, Locationve DOCUMENT. Orada farklı davranışları test etmedim


2
Hizmetlerin "yeniden başlatılmasını" zorunlu kılmak için devletin zaten hizmetlerde depolanmaması gerektiğini belirtmek gerekir.
andersonvom

19
Bunu kim söyledi? Önbelleğe alınmış verileri nerede saklamalı?
danza

5
Ben vatansız yerine durum bilgisi, hizmetlerde saklanan veri nedeniyle çok ve çok hata tökezledi. Bir önbellekleme hizmetinden bahsetmediğimiz sürece (bu durumda, onu temizlemek için bir arabirim olurdu), verileri hizmetlerin dışında ve denetleyicilerde tutardım. Örneğin, verileri localStorage içinde tutabilir ve erişmek için bir hizmet kullanabilirsiniz. Bu, hizmetin verileri doğrudan içinde tutmasını engeller.
andersonvom

2
@danza Önbelleğe alınmış verileri nerede depolamalı? ... bir model nesnesi mi? Howver Angular, MVCS bileşenlerini adlandırmak için korkunç bir iş çıkardı. Enjekte edilebilir model nesnelerini module.value API'si aracılığıyla saklıyorum. Daha sonra bir ng hizmetinde tanımladığım çeşitli API'ler, model nesnesini değiştirir, komutlar gibi çalışır.
jusopi

2
Elbette, bu işe yarayacak, ama iyi bir uygulama değil. $ Penceresi ile ilgili belgelere bakın , kullanım nedeni başlangıçta açıklanmıştır: Pencere JavaScript'te global olarak kullanılabilirken, global bir değişken olduğu için test edilebilirlik sorunlarına neden olur. Açısal olarak her zaman $ window hizmeti üzerinden bahsediyoruz, bu yüzden geçersiz kılınabilir, test için kaldırılabilir veya alay edilebilir
danza

38

Belirli bir rota yolu için sayfayı yeniden yüklemek için: -

$location.path('/path1/path2');
$route.reload();

6
Neden bilmiyorum ama .reload () yöntemi burada çalışmıyor gibi görünüyor. Hiçbir şey yeniden ortaya çıkmaz.
mircobabini

28

Açısal ui-yönlendirici kullanıyorsanız , bu en iyi çözüm olacaktır.

$scope.myLoadingFunction = function() {
    $state.reload();
};

Benim cli projesinde dağıtım sonra paylaşılan barındırma. Projemi yeniden yüklerken, bu sorunu çözmek için 404 hatası veriyor. 'Use hash' eklerseniz, o zaman '#' ile çalışır, ancak bunu istemiyorum, çözülebilecek bir yol var mı.
T. Shashwat

24

Denetleyicinizin bağımlılıklarını beyan ederken "$ route" eklemeyi unutmuş olabilirsiniz:

app.controller('NameCtrl', ['$scope','$route', function($scope,$route) {   
   // $route.reload(); Then this should work fine.
}]);

9

Her şeyi yeniden yüklemek için window.location.reload () öğesini kullanın; angularjs ile

Çalışma örneğine göz atın

HTML

<div ng-controller="MyCtrl">  
<button  ng-click="reloadPage();">Reset</button>
</div>

angularjs

var myApp = angular.module('myApp',[]);

function MyCtrl($scope) {
    $scope.reloadPage = function(){window.location.reload();}
}

http://jsfiddle.net/HB7LU/22324/


7

Kullandığınız hizmetleri yenilerken denetleyiciyi yenilemek istiyorsanız, bu çözümü kullanabilirsiniz:

  • $ State enjekte et

yani

app.controller('myCtrl',['$scope','MyService','$state', function($scope,MyService,$state) {

    //At the point where you want to refresh the controller including MyServices

    $state.reload();

    //OR:

    $state.go($state.current, {}, {reload: true});
}

Bu, denetleyiciyi ve HTML'yi yenileyecek ve Yenile veya Yeniden Oluştur olarak da adlandırabilirsiniz .


2
bu ui yönlendirici içindir açısal için değil.
dgzornoza

6

Açısal 2'den Önce (Açısal J'ler)

Güzergah boyunca

$route.reload();

Tüm Uygulamayı yeniden yüklemek istiyorsanız

$window.location.reload();

Açısal 2+

import { Location } from '@angular/common';

constructor(private location: Location) {}

ngOnInit() {  }

load() {
    this.location.reload()
}

Veya

constructor(private location: Location) {}

ngOnInit() {  }

Methods (){
    this.ngOnInit();
}

FYI - Açısal 7: "Konum" türünde "yeniden yükleme" özelliği yok ".
ACEG

@Cristina bilginiz teşekkürler. Bunu açısal 7'den önce kullanıyorum
Thilina Sampath

5

Anladığım en kolay çözüm,

her geri döndüğünde yeniden yüklenmesini istediğiniz rotaya '/' ekleyin.

Örneğin:

aşağıdakiler yerine

$routeProvider
  .when('/About', {
    templateUrl: 'about.html',
    controller: 'AboutCtrl'
  })

kullanımı

$routeProvider
  .when('/About/', { //notice the '/' at the end 
    templateUrl: 'about.html',
    controller: 'AboutCtrl'
  })

2
@PardeepJain Bu benim için çalıştı. Bu yüzden bu bir cevaptır. Cevabımı indirdin mi?
diyoda_

1
hayır hayır, cevabınız aşağı itmek için o kadar da kötü değil. şaşırtıcı ben şimdi neden aynı açısal benim için çalışmıyor2.
Pardeep Jain

2
Mükemmel çözüm. Thks!
simon

Orijinal yolunuz uygulamanın kökü olsa bile bu işe yarar - /: O //
Rotam

Açısal 6'da # same kullandıktan sonra çalışır Angular2 için de kullanılabilir. Sanırım
T. Shashwat

5

Aşağıdakilerden birini deneyin:

$route.reload(); // don't forget to inject $route in your controller
$window.location.reload();
location.reload();

4

Önbelleği kaldırmak ve sayfayı yeniden yüklemek için bu çalışma kodunu aldım

Görünüm

        <a class="btn" ng-click="reload()">
            <i class="icon-reload"></i> 
        </a>

kontrolör

Enjektörler: $ scope, $ state, $ stateParams, $ templateCache

       $scope.reload = function() { // To Reload anypage
            $templateCache.removeAll();     
            $state.transitionTo($state.current, $stateParams, { reload: true, inherit: true, notify: true });
        };

3

Kullanıcıya samimi yeniden yükleme bildirimi olmadan aşağıdaki kodu kullanın. Sayfayı oluşturacak

var currentPageTemplate = $route.current.templateUrl;
$templateCache.remove(currentPageTemplate);
$window.location.reload();

-8

Aylarca bu sorunla mücadele ettik ve benim için çalışan tek çözüm şuydu:

var landingUrl = "http://www.ytopic.es"; //URL complete
$window.location.href = landingUrl;

4
Bu, $window.location.reload()OP'nin özel olarak bahsettiği durumdan çok farklı değildir.
Tüm İşçiler
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.