2013-07-07 24 views
151

Tôi có thể thiết lập đường dẫn với params tùy chọn (cùng mẫu và điều khiển, nhưng một số params nên bỏ qua nếu họ không tồn tại?Tuyến đường angularjs có các giá trị tham số tùy chọn không?

Vì vậy, thay vì viết hai quy tắc sau đây, 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}) 
}]); 

Something như thế này ([param này là không bắt buộc])

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 hướng dẫn của họ.

+0

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

+0

thực sự? Tôi đang trên 1.1.5, đã thử với mã [: userId] và không bỏ qua chúng. –

+0

thử mà không có '[]'. Xem cam kết này: https://github.com/angular/angular.js/commit/53061363c7aa1ab9085273d269c6f04ac2162336 –

Trả lời

225

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

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

path có thể chứa các nhóm tên là bắt buộc với một dấu 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 ('/ claim/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,// ​​claim/documents/1234/'phù hợp, nhưng'/khiếu nại/tài liệu/1234' không. –

+1

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

+5

Do Angular 1.3, vấn đề dấu gạch chéo được đề cập trong các nhận xét ở trên là Điều hướng đến/claim/documents/1234/hoạt động chính xác, cũng như/claim/documents/1234. Tóm lại, nó hoạt động có hoặc không có dấu gạch chéo. –

2

Trên thực tế tôi nghĩ rằng OZ_ có thể được phần nào chính xác.

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

53

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ể làm nhiều như bạn cần thông số tùy chọn.

8

Xin xem @jlareau trả lời ở đây: https://stackoverflow.com/questions/11534710/angularjs-how-to-use-routeparams-in-generating-the-templateurl

Bạn có thể sử dụng một chức năng để tạo ra các mẫu chuỗi:

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:'/'}); 
    } 
); 
0

@JamesBell Bạn có thể sử dụng tùy chọn bí như đã được trả lời trong bài viết này: app state with optional param and no trailing slash

.state('path', { 
    url: '/path/:param1', 
    params: { 
     param1: { 
      value: null, 
      squash: true 
     } 
    }, 
    views: { 
     'map-tab': { 
      templateUrl: 'templates/map.html', 
      controller: 'testCtrl' 
     } 
    } 
}) 
+0

Điều này chỉ dành cho $ stateProvider và không phải cho $ routeProvider của Angular –

+0

Tôi đã sử dụng nó cho $ stateProvider. Không biết về tính tương thích với $ routeProvider. – oyaebunterkrah

+5

@oyaebunterkrah Nếu bạn không biết thì xin đừng trả lời. –

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