40

Tôi đang cố gắng viết ứng dụng web đầu tiên của mình với Angular.Tắt thao tác URL trong AngularJS

Trong chế độ bình thường (html5Mode tắt), Góc buộc phần băm của địa chỉ trông giống như "đường dẫn" (thêm dấu "/") và mã hóa các ký tự đặc biệt - ví dụ, nó cho phép một chữ "?" và "#" trong băm và thay thế các giá trị khác bằng% 3F và% 23.

Có cách nào để tắt tính năng này không? Tôi không muốn sử dụng các tính năng $ locationProvider/$ routeProvider - Tôi muốn phân tích cú pháp bản thân mình (Trong trường hợp của tôi, người dùng sẽ nhập một số "văn bản miễn phí" vào băm để tìm kiếm bên trong trang web của tôi).

tôi đọc mà routeProvider không thể được cấu hình để sử dụng biểu thức thông thường ...

Nếu htmlMode được bật, sau đó một phần băm của địa chỉ không được buộc phải trông giống như một con đường (không hàng đầu "/"), nhưng nó vẫn mã hóa các ký tự đặc biệt. Tuy nhiên, tôi biết rằng một số trình duyệt có thể mã hóa/thoát các ký tự đặc biệt, nhưng nếu người dùng quản lý nhập một số ký tự đặc biệt trong thanh địa chỉ thì tôi không muốn thay đổi nó.

Cảm ơn

Trả lời

58

Không chắc chắn về tác dụng phụ của việc này, nhưng công việc đã hoàn thành. Lưu ý rằng nó sẽ vô hiệu hóa tất cả các thao tác vị trí từ ứng dụng góc cạnh, ngay cả khi dự định.

angular.module('sample', []) 
    .config(['$provide', function ($provide){ 
     $provide.decorator('$browser', ['$delegate', function ($delegate) { 
      $delegate.onUrlChange = function() {}; 
      $delegate.url = function() { return ""}; 
      return $delegate; 
     }]); 
    }]); 

Đã thử nghiệm trong Chrome 30, IE9, IE10.
Lấy cảm hứng từ https://stackoverflow.com/a/16678065/369724

+0

Huh, tôi đã từ bỏ ý tưởng về tính năng này một thời gian dài trước đây ... Chỉ để ghi lại, tôi chấp nhận câu trả lời của bạn mặc dù tôi chưa thử nghiệm nó. – Oren

+1

Cảm ơn. Hy vọng rằng một người nào đó trong nhóm angularjs sẽ vấp ngã trên này và nói với tôi rằng có một cách đúng đắn. Giải pháp này mất nhiều thử/lỗi và không được tìm thấy cho đến khi tôi bắt đầu đọc mã nguồn của góc cạnh. Khách hàng hiện đang hạnh phúc, và tôi sẽ loại bỏ khuôn khổ như vậy ngay khi tôi có thời gian. Nó là một món đồ chơi ấn tượng, nhưng đã được chứng minh là không thực tế để tìm hiểu và mở rộng. –

+1

Góc thử lại để thao tác vị trí dẫn đến vòng lặp vô hạn. – gronke

1

Nếu tôi nhớ chính xác, định tuyến góc là không bắt buộc, nhưng sau đó bạn phải chăm sóc bản tải lại bộ điều khiển, quan điểm vv

+2

Nó không bắt buộc, nhưng nó luôn bật. Bạn sẽ thấy điều này nếu bạn có một trang (foo.html # abc). Nếu bạn tải lại, nó sẽ trở thành (foo.html #/abc). Xung đột tôi gặp phải với API window.history không thành công khi pushState (...); back(); forward(); vì góc cạnh đã thay thế url nên lịch sử chuyển tiếp bị mất - mặc dù tôi không sử dụng định tuyến nào cả ở phần góc cạnh của trang. –

+0

Tôi sẽ thử tùy chỉnh xây dựng Angular, mặc dù tôi đã không bao giờ làm điều này bản thân mình :) Ma quỷ là trong 'src/ng/location.js'. Tham chiếu đến tệp này sẽ bị xóa khỏi 'angularFiles.js' để Grunt sẽ không gói nó. Tôi cho rằng bạn cũng nên loại bỏ tham chiếu đến '$ LocationProvider' khỏi' src/AngularPublic.js' để tránh lỗi. – Adam

6

tôi sử dụng một bản sao cục bộ của angular.js. Tìm kiếm

$browser.onUrlChange(function(newUrl, newState) { 

$rootScope.$watch(function $locationWatch() { 

bình luận ra các dòng tương ứng và angularjs sẽ dừng đồng hồ để thay đổi vị trí url.

+1

cảm ơn, sẽ rất dễ dàng để thực hiện một tùy chọn cho điều này trong angularjs –