Cách tải lại hoặc kết xuất lại toàn bộ trang bằng AngularJS


299

Sau khi hiển thị toàn bộ trang dựa trên một số bối cảnh người dùng và đã thực hiện một số $httpyêu cầu, tôi muốn người dùng có thể chuyển đổi bối cảnh và kết xuất lại mọi thứ một lần nữa (gửi lại tất cả các $httpyêu cầu, v.v.). Nếu tôi chỉ chuyển hướng người dùng ở một nơi khác, mọi thứ sẽ hoạt động đúng:

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

Nếu tôi sử dụng $window.location.reload(), thì một số $httpyêu cầu auth.impersonate(username)đang chờ phản hồi sẽ bị hủy, vì vậy tôi không thể sử dụng yêu cầu đó. Ngoài ra, hack $location.path($location.path())cũng không hoạt động (không có gì xảy ra).

Có cách nào khác để kết xuất lại trang mà không phát hành lại tất cả các yêu cầu một cách thủ công không?


Như Alvaro Joao nói dưới đây, bạn cần sử dụng angular-route.js để làm việc này. bennadel.com/blog/ từ
Yvonne Aburrow

Bản sao có thể có của AngularJs: Trang tải lại
Alena Kastsiukavets

Câu trả lời:


404

Đối với bản ghi, để buộc góc phải kết xuất lại trang hiện tại, bạn có thể sử dụng:

$route.reload();

Theo tài liệu của AngularJS :

Làm cho dịch vụ $ tuyến tải lại tuyến hiện tại ngay cả khi vị trí $ không thay đổi.

Do đó, ngView tạo ra phạm vi mới, khôi phục lại bộ điều khiển.


6
Cảm ơn vì nhận xét, vì một số lý do tôi dường như có hành vi hơi khác khi tôi sử dụng $route.reload()so với làm mới bình thường. Ví dụ: một tab được thiết lập để hiển thị ban đầu khi làm mới, nhưng khi phương thức tải lại dường như tải lại trang mà không đặt tab, không chắc vấn đề là gì.
Doug Molineux

2
Điều này có chạy bộ lọc / dịch vụ là tốt? Bắt trạng thái dai dẳng không mong muốn. Chỉnh sửa: Vẫn được nâng cấp để trả lời chính xác câu hỏi & điều này siêu hữu ích. Cảm ơn bạn
cấp

10
Hãy nhớ tiêm $routevào bộ điều khiển để làm việc này.
Neel

6
@alphapilgrim Mô-đun ngRoute không còn là một phần của lõi angular.js file. Nếu bạn đang tiếp tục sử dụng $routeProviderthì bây giờ bạn sẽ cần đưa angular-route.jsvào HTML của mình:
Alvaro Joao

3
$ state.reload () nếu bạn sử dụng stateProvider
Lalit Rao

314

$route.reload()sẽ xác nhận lại các bộ điều khiển nhưng không phải các dịch vụ. Nếu bạn muốn đặt lại toàn bộ trạng thái của ứng dụng của mình, bạn có thể sử dụng:

$window.location.reload();

Đây là một phương thức DOM tiêu chuẩn mà bạn có thể truy cập khi tiêm dịch vụ $ window .

Nếu bạn muốn chắc chắn tải lại trang từ máy chủ, ví dụ như khi bạn đang sử dụng Django hoặc một khung web khác và bạn muốn kết xuất phía máy chủ mới, hãy chuyển truenhư một tham số reload, như được giải thích trong tài liệu . Vì điều đó đòi hỏi sự tương tác với máy chủ, nó sẽ chậm hơn nên chỉ thực hiện khi cần thiết

Góc 2

Ở trên áp dụng cho góc 1. Tôi không sử dụng góc 2, trông giống như các dịch vụ khác nhau ở đó, có Router, LocationDOCUMENT. Tôi đã không kiểm tra các hành vi khác nhau ở đó


2
Điều đáng chú ý là dù sao người ta cũng không nên lưu trữ trạng thái trong các dịch vụ để yêu cầu dịch vụ được "khởi động lại".
andersonvom

19
Ai nói vậy? Trường hợp nào được cho là lưu trữ dữ liệu lưu trữ?
danza

5
Tôi đã vấp phải rất nhiều lỗi do dữ liệu được lưu trữ trong các dịch vụ, khiến chúng trở nên trạng thái hơn là không trạng thái. Trừ khi chúng ta đang nói về một dịch vụ lưu trữ (trong trường hợp đó, sẽ có một giao diện để xóa nó), tôi sẽ giữ dữ liệu ra khỏi các dịch vụ và trong các bộ điều khiển. Chẳng hạn, người ta có thể giữ dữ liệu trong localStorage và sử dụng một dịch vụ để truy cập nó. Điều này sẽ giải phóng dịch vụ khỏi việc giữ dữ liệu trực tiếp trong đó.
andersonvom

2
@danza Nơi nào được cho là lưu trữ dữ liệu được lưu trữ? ... một đối tượng kiểu mẫu? Howver Angular đã thực hiện một công việc khủng khiếp là đặt tên cho các thành phần MVCS của họ. Tôi giữ các đối tượng mô hình có thể tiêm thông qua API module.value. Sau đó, các API khác nhau mà tôi đã xác định trên một dịch vụ ng làm thay đổi đối tượng mô hình hoạt động giống như các lệnh.
jusopi

2
Chắc chắn, điều đó sẽ làm việc, nhưng nó không phải là thực hành tốt. Xem tài liệu về $ window , lý do sử dụng nó được giải thích ngay từ đầu: Mặc dù cửa sổ có sẵn trên toàn cầu trong JavaScript, nhưng nó gây ra các vấn đề về kiểm tra, bởi vì nó là biến toàn cục. Trong góc cạnh, chúng tôi luôn đề cập đến nó thông qua dịch vụ $ window, vì vậy nó có thể bị ghi đè, xóa hoặc chế giễu để thử nghiệm
danza

38

Để tải lại trang cho đường dẫn cụ thể: -

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

6
Không biết tại sao nhưng phương thức .reload () dường như không hoạt động ở đây. Nó không bất cứ điều gì.
mircobabini

28

Nếu bạn đang sử dụng ui-router góc thì đây sẽ là giải pháp tốt nhất.

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

Trong dự án cli của tôi sau khi triển khai để chia sẻ lưu trữ. Khi tôi đang tải lại dự án của mình, nó đưa ra lỗi 404 để giải quyết vấn đề này đã được sử dụng. Nếu tôi thêm 'sử dụng hàm băm', thì nó hoạt động với '#', nhưng tôi không muốn điều này, có cách nào giải quyết được không.
T. Shashwat

24

Có lẽ bạn đã quên thêm "$ route" khi khai báo các phụ thuộc của Trình điều khiển của bạn:

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

9

Chỉ cần tải lại mọi thứ, sử dụng window.location.reload (); với angularjs

Kiểm tra ví dụ làm việc

HTML

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

góc cạnh

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

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

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


7

Nếu bạn muốn làm mới bộ điều khiển trong khi làm mới bất kỳ dịch vụ nào bạn đang sử dụng, bạn có thể sử dụng giải pháp này:

  • Tiêm $ bang

I E

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

Điều này sẽ làm mới bộ điều khiển và HTML cũng như bạn có thể gọi nó là Làm mới hoặc Kết xuất lại .


2
Đây là cho bộ định tuyến ui không dành cho góc.
dgzornoza

6

Trước Angular 2 (AngularJs)

Qua tuyến đường

$route.reload();

Nếu bạn muốn tải lại toàn bộ Ứng dụng

$window.location.reload();

Góc 2+

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

constructor(private location: Location) {}

ngOnInit() {  }

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

Hoặc là

constructor(private location: Location) {}

ngOnInit() {  }

Methods (){
    this.ngOnInit();
}

FYI - Angular 7: "Tài sản 'tải lại' không tồn tại trên loại 'Vị trí'".
ACEG

@Cristina cảm ơn thông tin của bạn. Tôi sử dụng nó trước góc 7
Thilina Sampath

5

Giải pháp dễ nhất tôi nghĩ là

thêm '/' vào tuyến đường muốn được tải lại mỗi lần khi quay lại.

ví dụ:

thay vì sau đây

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

sử dụng,

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

2
@PardeepJain Điều này làm việc cho tôi. Đó là lý do tại sao đây là một câu trả lời. Bạn đã downvote câu trả lời của tôi?
diyoda_

1
không không, câu trả lời của bạn không quá tệ để downvote. tuyệt vời bây giờ tôi không biết tại sao cùng làm việc với tôi trong angular2.
Pardeep Jain 27/2/2016

2
Giải pháp hoàn hảo. Thks!
simon

Điều này hoạt động ngay cả khi đường dẫn ban đầu của bạn là gốc của ứng dụng - /: O Tuyến đường của tôi bây giờ trông như thế này://
MadPhysicist

Trong Angular 6, nó cũng hoạt động sau khi sử dụng # same cho Angular2. nghĩ vậy
T. Shashwat

5

Hãy thử một trong những điều sau đây:

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

4

Tôi đã nhận được mã làm việc này để xóa bộ nhớ cache và tải lại trang

Lượt xem

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

Bộ điều khiển

Các đầu phun: $ scope, $ state, $ stateParams, $ templateCache

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

3

Sử dụng mã sau đây mà không cần thông báo tải lại thân mật cho người dùng. Nó sẽ hiển thị trang

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

-8

Tôi đã chiến đấu khó khăn với vấn đề này trong nhiều tháng và giải pháp duy nhất hiệu quả với tôi là:

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

4
Điều này hầu như không khác với việc $window.location.reload()OP đề cập cụ thể không hoạt động đúng trong trường hợp của anh ta.
Tất cả công nhân là điều cần thiết
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.