AngularJS - Làm cách nào để thực hiện chuyển hướng khi tải toàn trang?


94

Tôi muốn thực hiện chuyển hướng tải lại toàn bộ trang để cookie từ máy chủ web của tôi được làm mới khi trang tải. window.location = "/#/Next"window.location.href = "/#/Next"không hoạt động, chúng thực hiện một tuyến Angular mà không đánh vào máy chủ.

Cách chính xác để thực hiện yêu cầu máy chủ đầy đủ trong bộ điều khiển Angular là gì?


8
bạn đã bao giờ giải quyết điều này?
superjos

7
bạn đã bao giờ giải quyết điều này?
Nolwennig

6
bạn đã bao giờ giải quyết điều này?
Dan Beaulieu

5
bạn đã bao giờ giải quyết điều này?
Ngăn xếp của tôi tràn vào

4
bạn đã bao giờ giải quyết điều này?
shahzain ali

Câu trả lời:


183

Đối với <a>các thẻ :

Bạn cần gắn thẻ target="_self"của mình<a>

Có ba trường hợp AngularJS sẽ thực hiện tải lại toàn bộ trang:

  • Các liên kết có chứa phần tử đích
    Ví dụ:<a href="https://stackoverflow.com/ext/link?a=b" target="_self">link</a>
  • Các liên kết tuyệt đối đi đến một miền khác
    Ví dụ:<a href="http://angularjs.org/">link</a>
  • Các liên kết bắt đầu bằng '/' dẫn đến một đường dẫn cơ sở khác khi cơ sở được xác định
    Ví dụ:<a href="https://stackoverflow.com/not-my-base/link">link</a>

Sử dụng javascript :

Các $locationdịch vụ cho phép bạn thay đổi duy nhất địa chỉ URL; nó không cho phép bạn tải lại trang. Khi bạn cần thay đổi URL và tải lại trang hoặc điều hướng đến một trang khác, hãy sử dụng một API mức thấp hơn: $window.location.href.

Xem:


15
$ window.location.href thực hiện tương tự như window.location.href. Tôi khá chắc chắn rằng $ window chỉ là một dịch vụ gói cho window. Cả hai cách đều thực hiện một tuyến đường Angular thay vì làm mới toàn trang.
Mike Pateras

3
$ window.location.href chắc chắn gây ra làm mới toàn trang, tôi đang làm điều đó trong ứng dụng của mình.
jszobody

3
Tôi đã đọc điều tương tự. Không hoạt động trong phiên bản Chrome hiện tại. Nó thực hiện một tuyến đường Angular.
Mike Pateras

1
1.0.6 từ CDN. Tôi đang thực hiện việc này trong vòng gọi lại thành công $ http.post, nếu điều đó quan trọng, mặc dù tôi đã thử nó bên ngoài cuộc gọi lại và nhận được kết quả tương tự. Nếu tôi thực hiện chuyển hướng đến "/" (mà tôi cũng xác định tuyến Angular), nó hoạt động với tính năng làm mới toàn trang, nhưng "/ # / Next" chỉ thay đổi chế độ xem.
Mike Pateras

5
<a href="..." target="_self">là những gì đã làm việc cho tôi. cảm ơn !
Michael

33

Chúng tôi đã gặp vấn đề tương tự, làm việc từ mã JS (tức là không phải từ neo HTML). Đây là cách chúng tôi giải quyết điều đó:

  1. Nếu cần, hầu như thay đổi URL hiện tại thông qua $locationdịch vụ. Điều này có thể hữu ích nếu đích của bạn chỉ là một biến thể trên URL hiện tại, để bạn có thể tận dụng các $locationphương pháp trợ giúp. Ví dụ: chúng tôi đã chạy $location.search(..., ...)để chỉ thay đổi giá trị của một tham số chuỗi truy vấn.

  2. Tạo URL đích mới, sử dụng URL hiện tại $location.url()nếu cần. Để hoạt động, cái mới này phải bao gồm mọi thứ sau lược đồ, miền và cổng. Vì vậy, ví dụ: nếu bạn muốn chuyển đến:

    http://yourdomain.com/YourAppFolder/YourAngularApp/#/YourArea/YourAction?culture=vi

    thì bạn nên đặt URL như trong:

    var destinationUrl = '/YourAppFolder/YourAngularApp/#/YourArea/YourAction?culture=en';

    (với cả hàng đầu '/').

  3. Chỉ định URL đích mới ở cấp thấp :$window.location.href = destinationUrl;

  4. Buộc tải lại, vẫn ở mức thấp: $window.location.reload();


1
Điều này không hiệu quả với tôi trong Angular 1.3.1 với Chrome 38. Giá trị của $ window.location.href không thay đổi khi tôi chỉ định một đường dẫn hoặc một URL đầy đủ. Chỉ $ window.location.assign () phù hợp với tôi.
FelixM

Gặp vấn đề tương tự như Felix, đã giải quyết nó theo một cách khác stackoverflow.com/questions/31137809/…
Soroush Hakami

13

Sau khi tìm kiếm và đưa ra lượt truy cập và phiên dùng thử, tôi có thể solo nó bằng cách chỉ định url trước tiên như

$window.location.href = '/#/home/stats';

sau đó tải lại

$window.location.reload();

Điều này dường như khắc phục được sự cố, nhưng nhấp vào quay lại và chuyển tiếp trên trình duyệt sẽ gây ra nhiều mâu thuẫn.
luisluix

9

Tôi gặp vấn đề tương tự. Khi tôi sử dụng window.location, $window.locationhoặc thậm chí <a href="..." target="_self">tuyến đường không làm mới trang. Vì vậy, các dịch vụ được lưu trong bộ nhớ cache được sử dụng không phải là những gì tôi muốn trong ứng dụng của mình. Tôi đã giải quyết nó bằng cách thêm window.location.reload()after window.locationđể buộc trang tải lại sau khi định tuyến. Phương pháp này dường như tải trang hai lần. Có thể là một thủ thuật bẩn thỉu, nhưng nó hoạt động hiệu quả. Đây là cách tôi có nó bây giờ:

  $scope.openPage = function (pageName) {
      window.location = '#/html/pages/' + pageName;
      window.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.