2013-03-04 62 views
38

Trong ứng dụng Angularjs, tôi có một url như
http://url.com/my_app/#/store/items.
Bây giờ tôi muốn nối thêm chuỗi truy vấn chẳng hạn,
http://url.com/my_app/#/store/items?page=2.

nhưng trong url, javascript mã hóa số mà tôi không muốn. Nó sẽ vẫn còn "?" chỉ trong url như angularjs $ location.search() trả về không có gì cho "% 3F".

Làm cách nào để thực hiện?cách vượt qua "dấu chấm hỏi" trong url javascript

+0

Kiểm tra http://www.w3schools.com/jsref/jsref_encodeuri.asp này – 999k

+0

nên các mẫu url trông như 'http://url.com/my_app/#/store/items/page/2' thay vì 'http: //url.com/my_app/#/store/items? page = 2'. Vì nó có thể chính xác hơn để có '/' mẫu thay vì '?' Mẫu sau khi '#' – rajkamal

+0

không, tôi chỉ muốn thêm nó vào qurystring thôi .. Yêu cầu của nó // – Amb

Trả lời

81

Không có đủ chi tiết trong câu hỏi của bạn vì vậy tôi sẽ cho rằng bạn đang sử dụng AngularJS định tuyến - hoặc ít nhất là $location service - trong chế độ phi HTML5. Nếu vậy, phần sau ký tự # đại diện cho URL của bạn từ quan điểm đơn trang ứng dụng (xem thêm về AngularJS here).

Nếu các giả định trên là chính xác, có nghĩa là bạn không nên cố gắng thêm hoặc thao tác dấu chấm hỏi "bằng tay". Thay vào đó, bạn nên thay đổi phần search của $location để thao tác chuỗi truy vấn (một phần sau ?) và dấu chấm hỏi sẽ được thêm/xóa vào URL cuối cùng nếu cần.

Trong trường hợp của bạn, bạn có thể viết:

$location.path('/store/items').search('page', 2) 

này được giả định rằng bạn đang thao tác URL từ JavaScript, như đã nêu trong câu hỏi của bạn.

+1

câu trả lời rất hay! hoạt động rất tốt cho tôi và nó sạch hơn rất nhiều so với những gì tôi đã làm đơn giản bởi vì tôi đã không RTFM: D –

+0

ya tìm hiểu điều gì đó mới mỗi ngày ... Cảm ơn câu trả lời này – JT703

+0

Chắc chắn là câu trả lời đúng. Loại sucks mặc dù nếu bạn có một URL dựng sẵn từ một nơi khác trong ứng dụng mà bây giờ bạn phải phân tích thành 3 giá trị. Ugh ... đó là cái góc. Owch! – Mark

-2

Bạn có thể sử dụng decodeURIComponent.

Ví dụ:

decodeURIComponent('http://url.com/my_app/#/store/items%3Fpage=2'); 
// will give you `http://url.com/my_app/#/store/items?page=2` 
+1

tôi đã thử điều này nhưng nó không hoạt động nó chỉ cần "?" – Amb

+0

Đừng fiddle với URL cho chính mình! Trong bối cảnh góc cạnh có những cách tốt hơn nhiều so với điều đó. Xem câu trả lời của @ pkozlowski.opensource hoặc thậm chí tốt hơn sử dụng $ state.go (để, params, tùy chọn) trong đó params là một đối tượng chứa tham số truy vấn được xác định trong trạng thái của bạn và giá trị của chúng không được mã hóa. – aaki

24

Nếu bạn đang sử dụng dịch vụ vị trí $ thì hãy sử dụng $location.url('/store/items?page=2') để thay thế. Đây là một phương pháp setter từ ít nhất 1.0.7 và làm việc một điều trị trong ứng dụng 1.1.5 của tôi.

+2

Xóa câu trả lời hay nhất nếu tất cả những gì bạn có là chuỗi url. – Vakey

1

Nếu bạn đang sử dụng ui-router được khuyên dùng, bạn có thể sử dụng $state.go(to, params, options) như được mô tả here.

Như điều kiện tiên quyết bạn cần xác định trạng thái của mình đúng cách, điều đó có nghĩa là mọi tham số truy vấn có thể phải được đặt cho ui-router. Xem ví dụ sau (pageotherParam):

$stateProvider. 
state('storeItems', { 
    url: '/store/items?page&otherParam', 
    templateUrl: '/modules/store/views/item.client.view.html' 
}); 

Và sau đó bạn chỉ có thể chuyển địa điểm ví dụ từ một bộ điều khiển bằng cách gọi

$scope.gotoItemsPage = function(page) { 
    $state.go('storeItems', { 
    page: page, 
    otherParam: 'Just a show off' 
    }); 
}; 

Không loay hoay với bảng mã cần thiết và rất dễ đọc!

2

bạn có thể tạo một đối tượng tham số như:

var param = { 
    page: 2 
} 
$location.url("/store/items").search(param) 
Các vấn đề liên quan