Angularjs Liên kết bình thường với html5Mode


76

Tôi đang làm việc với anglejs ở chế độ html 5. Điều này dường như kiểm soát tất cả các href trên trang. Nhưng điều gì sẽ xảy ra nếu tôi muốn có một liên kết đến một cái gì đó trong cùng một miền của ứng dụng nhưng không thực sự có trong ứng dụng. Một ví dụ sẽ là một pdf.

Nếu tôi làm theo <a href="https://stackoverflow.com/pdfurl">góc, tôi sẽ chỉ cố gắng sử dụng html5mode và sử dụng trình cung cấp tuyến đường để xác định chế độ xem nào nên được tải. Nhưng tôi thực sự muốn trình duyệt truy cập trang đó theo cách bình thường.

Có phải cách duy nhất để làm điều này là tạo quy tắc với nhà cung cấp tuyến đường và chuyển hướng đó đến đúng trang bằng window.location?

Câu trả lời:


148

ở chế độ HTML5, có ba trường hợp mà thẻ A không được viết lại: từ các tài liệu góc

  • Các liên kết có chứa một targetthuộc tính. Thí dụ:<a href="https://stackoverflow.com/ext/link?a=b" target="_self">link</a>
  • Các liên kết tuyệt đối trỏ đến một miền khác Example: <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 baseđược xác địnhExample: <a href="https://stackoverflow.com/not-my-base/link">link</a>

vì vậy trường hợp của bạn sẽ là 1. thêm target="_self"


Thật là một sửa chữa kỳ lạ, nhưng rất cảm ơn! Tôi nghĩ rằng góc nên cung cấp một cách đẹp hơn để báo hiệu này ..
Dark_eye

1
nó không phải là một sửa chữa. lý do là nó Ađược xử lý như một chỉ thị.
Eduard Gamonal 19/02/16

34

Kể từ phiên bản Angular v1.3.0, có một rewriteLinkstùy chọn cấu hình mới cho nhà cung cấp vị trí. Điều này sẽ tắt "chiếm quyền điều khiển" tất cả các liên kết trên trang:

module.config(function ($locationProvider) {
    $locationProvider.html5Mode({
        enabled: true,
        rewriteLinks: false
    });
});

Mặc dù việc vô hiệu hóa hành vi này cho tất cả các liên kết có thể không phải là ý định của bạn, nhưng tôi đăng bài này cho những người khác, như tôi, chỉ muốn sử dụng $locationở chế độ html5 để thay đổi URL mà không ảnh hưởng đến tất cả các liên kết.


6

Nếu bạn không muốn Angular kiểm soát href. Đặt một thuộc tính mục tiêu trên liên kết.

Vì vậy, PDF sẽ thông qua html5mode và routeProvider và trình duyệt sẽ chỉ chuyển đến url đó.


3

Giải pháp khác. Tất cả các liên kết sẽ hoạt động bình thường (tải lại trang). Các liên kết được đánh dấu bằng ng-href="https://stackoverflow.com/path"sẽ phát trên pushState. Giúp đỡ hack JS nhỏ với nó.

.config(["$locationProvider", function($locationProvider) {
    // hack for html5Mode customization
    $('a').each(function(){
        $a = $(this);
        if ($a.is('[target]') || $a.is('[ng-href]')){
        } else {
            $a.attr('target', '_self');
        }
    });

    $locationProvider.html5Mode(true);
}])

1
+1. Câu trả lời của Eduard Gamonal là câu trả lời đầy đủ nhất, nhưng điều này chắc chắn có vẻ như là một sự thay đổi lớn về việc sử dụng thẻ mục tiêu và đặc biệt liên quan đến tình huống mà nhóm của tôi đang ở nơi chúng tôi đang có kế hoạch thu hút một tiêu đề được chia sẻ bởi một nhóm khác.
Derek Greer

3
Vì đây là .config, nó sẽ không chỉ được chạy một lần? Có nghĩa là, nếu bạn có nhiều trang ảo có nội dung, có vẻ như điều này sẽ chỉ quét những mục hiện có trong DOM, chứ không phải những gì có thể được tìm nạp sau này như một phần của đường dẫn URL.
ryanm
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.