2013-08-05 28 views
9

Tôi đang xây dựng một ứng dụng AngularJS không nằm ở vị trí gốc domain.tld/blog. Tôi có thiết lập định tuyến cho mọi thứ trên cơ sở /blog. Tôi đã đưa thẻ cơ sở vào phần đầu của trang <base href="/blog">. html5Mode được đặt thành true. Trong ứng dụng mọi thứ hoạt động như mong đợi. Tuy nhiên, khi tôi nhấp vào một URL không phải góc cạnh bên ngoài vị trí cơ sở, trang không được tải. Dường như vị trí này được đánh bắt bởi các otherwise chức năng trong các bộ định tuyến:AngularJS định tuyến cướp các URL không phải là cơ sở khi tải lại trang được mong đợi

ROUTER.otherwise({ 
    redirectTo : '/blog' 
}); 

Vì vậy, khi tôi nhấp vào bất kỳ url, ví dụ: domain.tld/somewhere-else nó chuyển hướng đến domain.tld/blog. Rõ ràng đây là những gì bạn mong đợi: đối với mỗi URL không được tìm thấy trong bộ định tuyến, chuyển hướng nó đến 'trang chủ'. Trong ứng dụng của tôi, đây không phải là hành vi mong muốn. Tất cả các url không có trong bộ định tuyến phải được coi là url bình thường và kích hoạt lại một trang cho url đó.

Vì vậy, những gì tôi cần là một cái gì đó như thế này:

ROUTER.otherwise(
    window.location = theRequestedUrl; 
); 

này không làm việc rõ ràng. Nhưng bằng cách nào đó tôi cần phải vào bên trong phần khác của router và yêu cầu nó chuyển hướng đến trang có tải lại trang.

Các câu dưới đây liên quan: angular routing something weird happening

Các jsFiddle dưới đây trình bày vấn đề http://fiddle.jshell.net/43tub/6/show/light/ (nhờ @rdjs!). Click vào liên kết /outside nên làm mới trang đầy đủ ...

+0

phiên bản AngularJS bạn đang sử dụng? – rdjs

+0

@rdjs 1.1.5, nhưng hành vi là như nhau trong 1.0.7 – DivZero

+1

Điều này có thể giải quyết vấn đề một cách chính xác không? http://jsfiddle.net/43tub/6/ – rdjs

Trả lời

5

Nhìn vào code, có vẻ quan trọng là "/ blog /" thay vì "/ blog". Khi tôi thay đổi mà tôi đã có thể tham khảo liên kết tương đối:

<a href="./Book/Moby">Moby</a> | 
    <a href="./Book/Gatsby">Gatsby</a> | 
    <a href=".">base root</a> | 
    <a href="/Outside">Outside</a> | // gets a nice 404 

My jsfiddle, lưu ý location.pathname đó là luôn luôn thiết lập "[path] /", điều này cũng làm việc mã hóa cứng/_display/trong khi chỉnh sửa, nhưng jsfiddle chuyển đổi giữa _display/và workingdir/show/khi chạy chỉnh sửa và lưu các câu đố.

+2

Thật vậy, dấu gạch chéo còn thiếu là vấn đề! Tôi đã không bắt được điều này bởi vì dấu gạch chéo theo sau gây ra rất nhiều lỗi với các thư viện xung đột khiến tôi cho rằng nó không có dấu gạch chéo. Sau khi phân loại tất cả các lỗi với thư viện respond.js (tôi đã xóa proxy cho máy chủ lưu trữ tĩnh và sử dụng CSS bổ sung có điều kiện cho IE8 và dưới đây ...) Tôi đang sử dụng nó hoạt động như mong đợi! – DivZero

+0

Cảm ơn @DivZero! Tôi nghi ngờ rằng tôi sẽ buộc phải thêm khả năng tương thích IE8 trong ứng dụng của tôi trước khi chúng tôi ra mắt, vì vậy thật tuyệt khi được nghe về nó ngay bây giờ thay vì tự đánh vào nó sau này .. – lossleader

9

Theo góc documentation

Trong những trường hợp như sau, các liên kết không được viết lại; thay vào đó, trình duyệt sẽ thực hiện tải lại toàn bộ trang cho liên kết ban đầu.

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

Xem điều này có giúp bạn

+2

Cảm ơn bạn đã trả lời. Tuy nhiên tôi đã thử điều này rồi. Sử dụng một yếu tố mục tiêu là nog một giải pháp chấp nhận được đối với tôi. Và các liên kết bắt đầu bằng ''/'' không ** không ** làm việc như mong đợi/được ghi lại. Đây chính xác là những gì tôi cần, tuy nhiên nó chỉ đơn giản là không hoạt động ... – DivZero

+1

Giải pháp này làm việc cho tôi bằng cách sử dụng 'target =" _ self "' Cảm ơn bạn! –

+0

target = "_ self" hoàn hảo cho tôi. cảm ơn nhiều –

2

Bạn cũng có thể làm một cái gì đó như thế này:

var redirect = function(skip, url) { 
    console.log("Redirecting to ", url); 
    window.location.href = url 
}; 
$routeProvider 
    .when('/inside-router', { templateUrl: 'something.html' }) 
    .when('/get-me-away.html', { redirectTo: redirect }) 
    .when('/static/:file', { redirectTo: redirect }) 

Đây là một JSFiddle with a working example.

Về cơ bản bạn đang lạm dụng AngularJS sẽ gọi một hàm được đưa ra trong thuộc tính redirectTo và sau đó không làm gì hơn nếu hàm không trả về một chuỗi.

0

hy vọng nó sẽ giúp:

$routeProvider 
.when('...', {}) 
.otherwise({ 
    redirectTo: function() { 
    window.location = location.pathname; 
}}); 

sử dụng:
1.3.10/angular.js
1.3.10/góc-route.js

Các vấn đề liên quan