2013-03-01 27 views
35

Tôi đang làm việc với các tuyến đường AngularJS và đang cố gắng xem cách làm việc với các chuỗi truy vấn (ví dụ: url.com?key=value). Góc không hiểu các tuyến đường, trong đó có cặp khóa-giá trị so với cùng tên albums:cách chuyển chuỗi truy vấn trong các tuyến đường góc?

angular.module('myApp', ['myApp.directives', 'myApp.services']).config(
     ['$routeProvider', function($routeProvider) { 
      $routeProvider. 
      when('/albums', {templateUrl: 'albums.html', controller: albumsCtrl}). 
      when('/albums?:album_id', {templateUrl: 'album_images.html', controller: albumsCtrl}). 
      otherwise({redirectTo: '/home'}); 
     }], 
     ['$locationProvider', function($locationProvider) { 
      $locationProvider.html5Mode = true; 
     }] 
    ); 

Trả lời

25

Tôi không nghĩ rằng các tuyến đường làm việc với truy vấn dây. Thay vì url.com?key=value bạn có thể sử dụng một URL RESTful giống như url.com/key/value? Sau đó, bạn sẽ xác định tuyến đường của bạn như sau:

.when('/albums', ...) 
.when('/albums/id/:album_id', ...) 

hoặc có thể

.when('/albums', ...) 
.when('/albums/:album_id', ...) 
+0

đầu tiên là làm việc .. cảm ơn – Amb

+3

Bạn chỉ nhận được một phần của sự thật ở đây. các tuyến đường không hoạt động với các chuỗi truy vấn, vì truy vấn không phải là một phần của ** tuyến **. $ location có phương thức tốt cho các chuỗi truy vấn và hoạt động tốt, như đã nêu trong [Josh] (http://stackoverflow.com/a/25899932/2415119) –

2

params tuyến đường sử dụng

var Ctrl = function($scope, $params) { 
    if($params.filtered) { 
    //make sure that the ID is there and use a different URL for the JSON data 
    } 
    else { 
    //use the URL for JSON data that fetches all the data 
    } 
}; 

Ctrl.$inject = ['$scope', '$routeParams']; 

http://docs.angularjs.org/api/ng.$routeParams

+0

Tôi phải gọi hai chức năng khác nhau trong cả hai tuyến đường .. Tôi đã đề cập đến chức năng nào để gọi trong tệp html của họ .. Nó đang hiển thị album.html tốt nhưng không hiển thị album_images.html .. do đó chức năng của nó cũng không nhận được caled – Amb

14

Bạn có thể nhìn vào các phương pháp search trong $location (docs). Nó cho phép bạn thêm một số khóa/giá trị vào URL. Ví dụ: $location.search({"a":"b"}); sẽ trả lại URL này: http://www.example.com/base/path?a=b.

+3

Cảm ơn! Nó sẽ là tuyệt vời nếu bạn thêm một ví dụ về làm thế nào để tiêu thụ các 'a' param bên trong bộ điều khiển bằng cách sử dụng' $ routeParams' –

+1

@JossefHarush, Chỉ cần sử dụng '$ location.search()' để có được các params. –

0

tôi chỉ có thể nghĩ đến hai usecases cho chuỗi truy vấn trong URL:.

1) Nếu bạn cần các cặp khóa/giá trị của chuỗi truy vấn của bạn trong điều khiển của bạn (ví dụ in Xin chào {{name}} và nhận được tên trong chuỗi truy vấn chẳng hạn như? name = John), khi Francios nói chỉ cần sử dụng $ location.search và bạn sẽ nhận được chuỗi truy vấn dưới dạng đối tượng ({name: John}) mà bạn có thể sử dụng bằng cách đặt nó vào phạm vi hoặc thứ gì đó (ví dụ: $ scope.name = location.search(). name;).

Nếu bạn cần chuyển hướng đến một trang khác trong bộ định tuyến của bạn dựa trên những gì được cung cấp trong chuỗi truy vấn, như (? Page = Thatpage.htm), sau đó tạo chuyển hướngĐến: trong routerProvider.when() và nó sẽ nhận được đối tượng tìm kiếm làm tham số thứ ba của nó. nhìn vào 2:10 của video đầu vỏ trứng sau: http://www.thinkster.io/pick/SzcF8bGeVy/angularjs-redirectto

về cơ bản, redirectTo: function (routeParams, con đường, tìm kiếm) {return search.page}

+0

Downvote cho video có trả tiền –

60

Đúng là tuyến đường không làm việc với các chuỗi truy vấn , tuy nhiên điều đó không có nghĩa là bạn không thể sử dụng chuỗi truy vấn để chuyển dữ liệu giữa các trang khi chuyển đổi tuyến đường! Giới hạn rõ ràng với các thông số tuyến đường là chúng không thể được cập nhật mà không cần tải lại trang. Đôi khi điều này là không mong muốn, ví dụ sau khi lưu một bản ghi mới. Tham số tuyến ban đầu là 0 (để biểu thị một bản ghi mới) và bây giờ bạn muốn cập nhật nó với ID chính xác được trả về thông qua ajax để nếu người dùng làm mới trang, họ sẽ thấy bản ghi mới được lưu của họ. Không có cách nào để làm điều này với các tham số tuyến đường, nhưng điều này có thể được thực hiện bằng cách sử dụng chuỗi truy vấn để thay thế.

Bí mật không bao gồm chuỗi truy vấn khi thay đổi tuyến đường, bởi vì điều đó sẽ khiến nó không khớp với mẫu tuyến đường. Những gì bạn có thể làm là thay đổi tuyến đường và sau đó áp dụng các tham số chuỗi truy vấn. Về cơ bản

$location.path('/RouteTemplateName').search('queryStringKey', value).search(... 

Vẻ đẹp ở đây là dịch vụ $ routeParams coi chuỗi truy vấn có giá trị giống với thông số tuyến đường thực, vì vậy bạn thậm chí sẽ không cập nhật mã để xử lý chúng khác nhau. Bây giờ bạn có thể cập nhật các tham số mà không cần tải lại trang bằng cách bao gồm reloadOnSearch: false trong định nghĩa tuyến đường của bạn.

+0

Cảm ơn câu trả lời. Thật thú vị khi bạn có thể thay đổi tuyến đường bằng cách sử dụng thẻ neo của href với chuỗi truy vấn (như được hiển thị trong ví dụ về tài liệu tuyến đường $) nhưng không phải với $ location.path – jEremyB

+3

Câu trả lời hay. Đây sẽ là một ví dụ tuyệt vời cho các tài liệu chính thức thực sự, vì nó đã cho tôi một chút để hiểu rằng nhận được các thông số đã không nhận được quá khứ định tuyến. –

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