Các tuyến angularjs có thể có các giá trị tham số tùy chọn không?


166

Tôi có thể đặt tuyến đường với các thông số tùy chọn (cùng mẫu và bộ điều khiển, nhưng một số thông số nên được bỏ qua nếu chúng không tồn tại?

Vậy thay vì viết hai quy tắc sau, chỉ có một?

module.config(['$routeProvider', function($routeProvider) {
    $routeProvider.
     when('/users/', {templateUrl: 'template.tpl.html', controller: myCtrl}).            
     when('/users/:userId', {templateUrl: 'template.tpl.html', controller: myCtrl})
}]);

Một cái gì đó như thế này ([param này là tùy chọn])

when('/users[/:userId]', {templateUrl: 'template.tpl.html', controller: myCtrl})
//note: this previous doesn't work

Tôi không thể tìm thấy bất cứ điều gì trong tài liệu của họ.


chúng sẽ bị bỏ qua (không có []) trong phiên bản 1.1.5.
OZ_

có thật không? Tôi đang ở 1.1.5, đã thử mã [: userId] và không bỏ qua chúng.
Alexandru R

thử mà không có []. Xem cam kết này: github.com/angular/angular.js/commit/
cướp

Rất tiếc, đó là về $ resource, không chắc nó có hoạt động trong định tuyến không. xin lỗi.
OZ_

1
Nếu câu trả lời của g-orge là tốt, bạn có thể đánh dấu nó để mọi người không phải cuộn toàn bộ để tìm câu trả lời tốt nhất không?
AlexStack

Câu trả lời:


243

Có vẻ như Angular đã hỗ trợ cho việc này.

Từ các tài liệu (v1.2.0) mới nhất cho $routeProvider.when(path, route):

pathcó thể chứa các nhóm được đặt tên tùy chọn với dấu chấm hỏi ( :name?)


7
Bất kỳ cách nào để tránh sử dụng dấu gạch chéo? Nếu tuyến đường của tôi là: .when('/claims/documents/:CLAIMS_ID/:DOCUMENT_NAME?'...nó sẽ không khớp nếu url không có dấu gạch chéo. Vì vậy, /claims/documents/1234/phù hợp, nhưng /claims/documents/1234không.
James Bell

1
Muốn biết có ai có giải pháp cho vấn đề được báo cáo bởi @JamesBell
Leiko

5
Kể từ Angular 1.3, vấn đề dấu gạch chéo được đề cập trong các ý kiến ​​trên được khắc phục. Điều hướng đến / khiếu nại / tài liệu / 1234 / hoạt động chính xác, cũng như / khiếu nại / tài liệu / 1234. Nói tóm lại, nó hoạt động có hoặc không có dấu gạch chéo.
Judah Gabriel Himango

1
Tôi vẫn thấy hành vi này nếu tôi có một tham số tùy chọn trong tuyến đường của mình. Ví dụ: nếu tuyến đường là: '/: phân loại? / Gói / so sánh' và tôi cố gắng điều hướng đến url "/ gói / so sánh" thì nó hoạt động. Nếu tôi thử '/ gói / so sánh /' vì một số lý do, tôi nhận được mã asci được gắn vào phân loại hoặc '/% 3f / gói / so sánh' không phải là tuyến thực tế.
ruby_newbie

Tài liệu là khó hiểu.
Oliver Dixon

59

Giống như @ g-eorge đề cập, bạn có thể làm cho nó như thế này:

module.config(['$routeProvider', function($routeProvider) {
$routeProvider.
  when('/users/:userId?', {templateUrl: 'template.tpl.html', controller: myCtrl})
}]);

Bạn cũng có thể kiếm được nhiều như bạn cần các tham số tùy chọn.


8

Vui lòng xem @jlareau trả lời tại đây: /programming/11534710/angularjs-how-to-use-routeparams-in-generating-the-templateurl

Bạn có thể sử dụng một hàm để tạo chuỗi mẫu:

var app = angular.module('app',[]);

app.config(
    function($routeProvider) {
        $routeProvider.
            when('/', {templateUrl:'/home'}).
            when('/users/:user_id', 
                {   
                    controller:UserView, 
                    templateUrl: function(params){ return '/users/view/' + params.user_id;   }
                }
            ).
            otherwise({redirectTo:'/'});
    }
);

2

Thật ra tôi nghĩ OZ_ có thể đúng một chút.

Nếu bạn có tuyến đường '/users/:userId'và điều hướng đến '/users/'(lưu ý dấu /), $routeParamstrong bộ điều khiển của bạn phải là một đối tượng có userId: ""trong 1.1.5. Vì vậy, không có thông số userIdkhông hoàn toàn bị bỏ qua, nhưng tôi nghĩ đó là điều tốt nhất bạn sẽ nhận được.

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.