AngularJs: Trang tải lại


134
<a ng-href="#" class="navbar-brand" title="home" data-translate>PORTAL_NAME</a>

Tôi muốn tải lại trang. Tôi có thể làm cái này như thế nào?

Câu trả lời:


265

Bạn có thể sử dụng reloadphương pháp của $routedịch vụ. Tiêm $routevào bộ điều khiển của bạn và sau đó tạo một phương thức reloadRoutetrên của bạn $scope.

$scope.reloadRoute = function() {
   $route.reload();
}

Sau đó, bạn có thể sử dụng nó trên liên kết như thế này:

<a ng-click="reloadRoute()" class="navbar-brand" title="home"  data-translate>PORTAL_NAME</a>

Phương pháp này sẽ khiến tuyến đường hiện tại tải lại. Tuy nhiên, nếu bạn muốn thực hiện làm mới hoàn toàn, bạn có thể tiêm $windowvà sử dụng:

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


Chỉnh sửa sau (ui-router):

Như JamesEddyEdwards và Dunc đã đề cập trong câu trả lời của họ, nếu bạn đang sử dụng angular-ui / ui-router, bạn có thể sử dụng phương pháp sau để tải lại trạng thái / tuyến đường hiện tại. Chỉ cần tiêm $statethay vì $routevà sau đó bạn có:

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

2
Đây là một câu trả lời tốt nếu bạn mong muốn Angularise tải lại.
spikeheap

Làm cách nào tôi có thể thay đổi hành vi này trên toàn cầu thay vì thêm một hành động cho tất cả các liên kết
OMGPOP

@OMGPOP Chính xác thì bạn có ý nghĩa gì đối với tất cả các liên kết?
Alexandrin Rus

ý tôi là, đối với tất cả các liên kết bạn cần làm điều này. Có thể cấu hình một lần cho tất cả các liên kết?
OMGPOP

@AlexandrinRus điều này mang lại cho tôi các bước lặp [$ rootScope: infdig] 10 $ digest () đạt được. Hủy bỏ!
alphapilgrim

52

windowĐối tượng được cung cấp thông qua $windowdịch vụ để thử nghiệm và chế nhạo dễ dàng hơn , bạn có thể đi với một cái gì đó như:

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

Và:

<a ng-click="reloadPage"  class="navbar-brand" title="home"  data-translate>PORTAL_NAME</a>

Là một lưu ý phụ, tôi không nghĩ $ route.reload () thực sự tải lại trang, nhưng chỉ có tuyến .


2
Tôi khuyên bạn nên sử dụng $windowthay vì window.
Jeroen

Cảm ơn sự đóng góp của bạn. Bạn sẽ giải thích cho chúng tôi tại sao?
Florian F.

1
Vâng xin lôi. Nó được giải thích tốt nhất bởi các $windowtài liệu , chủ yếu là vì reloadPagenó sẽ (tốt hơn) có thể kiểm tra được khi sử dụng $window.
Jeroen

19
 location.reload(); 

Có lừa không.

<a ng-click="reload()">

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

Không cần tuyến đường hay bất cứ thứ gì chỉ đơn giản là js cũ


2
yêu sự đơn giản!
Shawn de Wet

14

Tương tự như câu trả lời của Alexandrin, nhưng sử dụng $ state thay vì $ route:

(Từ câu trả lời SO của JimTheDev tại đây .)

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

<a ng-click="reloadState()" ... 

9

Nếu sử dụng Angenses bộ định tuyến tiên tiến hơn mà tôi chắc chắn khuyên dùng thì bây giờ bạn có thể chỉ cần sử dụng:

$state.reload();

Điều này về cơ bản là làm giống như câu trả lời của Dunc.


5

Giải pháp của tôi để tránh vòng lặp vô hạn là tạo một trạng thái khác đã thực hiện chuyển hướng:

$stateProvider.state('app.admin.main', {
    url: '/admin/main',
    authenticate: 'admin',
    controller: ($state, $window) => {
      $state.go('app.admin.overview').then(() => {
        $window.location.reload();
      });
    }
  });

2

Góc 2+

Tôi đã tìm thấy điều này trong khi tìm kiếm Angular 2+, vì vậy đây là cách:

$window.location.reload();

1
Nhân tiện, đây không phải là cụ thể cho góc cạnh, theo cách javascript của nó.
Nitin Jadhav

1

Thật dễ dàng để chỉ sử dụng $route.reload()(đừng quên tiêm $ route vào bộ điều khiển của bạn), nhưng từ ví dụ của bạn, bạn chỉ có thể sử dụng "href" thay vì "ng-href":

<a href=""  class="navbar-brand" title="home"  data-translate>PORTAL_NAME</a>

Bạn chỉ cần sử dụng ng-href để bảo vệ người dùng khỏi các liên kết không hợp lệ do họ nhấp vào trước khi Angular thay thế nội dung của các thẻ {{}}.


$ tuyến là một phần của ng.route.IRouteService ??
cracker

1

Trên Angular 1.5 - sau khi thử một số giải pháp trên muốn chỉ tải lại dữ liệu mà không làm mới toàn bộ trang, tôi gặp vấn đề với việc tải dữ liệu đúng cách. Mặc dù vậy, tôi nhận thấy rằng khi tôi đi đến một tuyến đường khác và sau đó tôi quay trở lại hiện tại, mọi thứ đều hoạt động tốt, nhưng khi tôi chỉ muốn tải lại tuyến đường hiện tại bằng cách sử dụng $route.reload(), thì một số mã không được thực thi đúng. Sau đó, tôi đã cố gắng chuyển hướng đến tuyến đường hiện tại theo cách sau:

$scope.someFuncName = function () {
    //go to another route
    $location.path('/another-route');
};

và trong cấu hình mô-đun, thêm cái khác when:

.config(['$routeProvider', function($routeProvider) {
     $routeProvider.when('/first-page', {
         templateUrl: '/first-template',
         controller: 'SomeCtrl'
     }).when('/another-route', {//this is the new "when"
         redirectTo: '/first-page'
     });
}])

và nó hoạt động tốt cho tôi Nó không làm mới toàn bộ trang, mà chỉ khiến bộ điều khiển và mẫu hiện tại tải lại. Tôi biết đó là một chút hack, nhưng đó là giải pháp duy nhất tôi tìm thấy.


một cách dễ dàng hơn có thể là var reload = $location.url(); $location.url(''); $timeout(function() { $location.url(reload); });; không cần tạo tuyến ngẫu nhiên. Nhưng thật thú vị khi xem mã nào không đánh giá lại cho bạn. Dường như redirectTos và các resolvehàm thậm chí thực hiện lại trên bình thường$route.reload() (nhìn vào console.log's).
Hashbrown

1
<a title="Pending Employee Approvals" href="" ng-click="viewPendingApprovals(1)">
                    <i class="fa fa-user" aria-hidden="true"></i>
                    <span class="button_badge">{{pendingEmployeeApprovalCount}}</span>
                </a>

và trong bộ điều khiển

 $scope.viewPendingApprovals = function(type) {
                if (window.location.hash.substring(window.location.hash.lastIndexOf('/') + 1, window.location.hash.length) == type) {
                    location.reload();
                } else {
                    $state.go("home.pendingApproval", { id: sessionStorage.typeToLoad });
                }
            };

và trong tập tin tuyến đường

.state('home.pendingApproval', {
        url: '/pendingApproval/:id',
        templateUrl: 'app/components/approvals/pendingApprovalList.html',
        controller: 'pendingApprovalListController'
    })

Vì vậy, nếu id được truyền trong url giống như những gì đến từ hàm được gọi bằng cách nhấp vào neo, thì chỉ cần tải lại, nếu không thì theo tuyến được yêu cầu.

Xin hãy giúp tôi cải thiện câu trả lời này, nếu điều này có ích. Bất kỳ, đề nghị đều được chào đón.


Điều này khiến tôi mất một tháng để tìm ra lý do tại sao trang không tải lại
sam

0

Điều này có thể được thực hiện bằng cách gọi phương thức reload () của đối tượng cửa sổ bằng JavaScript đơn giản

window.location.reload();


0

Điều này có thể được thực hiện bằng cách gọi phương thức reload () trong JavaScript.

location.reload();
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.