2012-09-21 32 views
30

Tôi có thể đặt giá trị mặc định của thông số của tuyến đường trong AngularJS không? Có cách nào để có /products/123/products/ được xử lý bởi cùng một tuyến đường không?Tuyến đường angularjs có các giá trị tham số mặc định không?

tôi đang tìm cách để cấu trúc lại mã hiện tại của tôi, trông giống như:

myModule.config(['$routeProvider', function($routeProvider) { 
    $routeProvider. 
    when('/products/', {templateUrl: 'products.html', controller: ProductsCtrl}).    
    when('/products/:productId', {templateUrl: 'products.html', controller: ProductsCtrl}) 
}]); 


function ProductsCtrl($scope, $routeParams) { 
    $scope.productId = typeof($routeParams.productId) == "undefined" ? 123 : $routeParams.productId; 
} 

Nó hoạt động, nhưng nó không phải là rất thanh lịch. Có cách nào tốt hơn ?

+0

Không quen thuộc với angularJS, nhưng những gì về 'var param = {templateUrl: 'products.html', bộ điều khiển : Sản phẩmCtrl}; $ routeProvider.when ('/ products /', param) .when ('/ products /: productId', param) '? – Rufus

+3

Bạn có thể đơn giản hóa mã điều khiển của mình một chút với: $ scope.productId = $ routeParams.productId || 123; – Gloopy

+0

@Gloopy khóa học này hoạt động nếu productId == 0 không phải là id hợp lệ –

Trả lời

24

AngularJS không cho phép giá trị mặc định cho thông số tuyến đường.

Nhưng tuyến đường (trong AngularJS) không được có thông số mặc định.

Tài nguyên có thể có thông số mặc định.

Trong AngularJS nếu bạn muốn một tuyến đường có tham số tùy chọn, đây thực sự là hai tuyến đường khác nhau.

Tại sao?

  • đường nên đơn giản

  • đường không cho phép biểu thức thông thường phù hợp với các thông số

  • đường không phải là một cái gì đó mà lộ ra một API để làm việc trong ứng dụng của bạn (không giống như tài nguyên làm). Các tuyến đường chỉ là cấu hình kết nối một URL với một mẫu và một bộ điều khiển. Do đó, có nhiều tuyến đường tốt hơn:

    • Rõ ràng là bản đồ lộ trình đến url nào.

    • Đó là chi tiết hơn, nhưng đơn giản hơn để đọc. Có nhiều tuyến đường phức tạp hơn sẽ tạo ra một đường cong học tập dốc hơn, nơi AngularJS không cần.

Không giống như các khuôn khổ server-side có các tuyến đường

  • AngularJS tuyến đường không có tên.
  • Bạn không tạo URL từ các tuyến đường đã xác định.
  • Bạn không có logic (các hàm a.k.a) trong định nghĩa tuyến đường.

Tuyến đơn giản = nhiều dòng để xác định chúng = ít đau đầu hơn khi làm việc với chúng.

LƯU Ý: Hãy ghi nhớ câu hỏi và câu trả lời này dành cho phiên bản cũ của AngularJS (1.0 tôi nghĩ) có sẵn trước khi triển khai các tuyến đường/tài nguyên mới.

+19

Mặc dù đây có thể là câu trả lời chính xác nhưng tôi không thấy bất kỳ đối số mạnh nào ở đây nên ngăn AngularJS không có tham số mặc định hoặc kết hợp tuyến đường tốt hơn. Lặp đi lặp lại mã giống hệt nhau luôn là vấn đề để bảo trì. –

+0

@ edA-qamort-ora-y Quan điểm của tôi là ở trạng thái hiện tại của các tuyến đường AngularJS (có thể sẽ thay đổi) các tuyến đường nên được giữ đơn giản. –

+1

Mặc dù cuộc hội thoại này hơi ngày tôi đã nghe nói rằng trong bản phát hành Angular 2 sẽ có hỗ trợ cho khớp mẫu cho các tuyến đường, điều này cũng có thể bao gồm một số cách để thực hiện các tham số tùy chọn hoặc mặc định. – shaunhusain

34

Tôi nhận ra rằng câu hỏi này cũ, nhưng vẫn còn: Tại sao bạn không chuyển hướng URL "trống" đến URL chứa productId mặc định?

myModule.config(['$routeProvider', function($routeProvider) { 
    $routeProvider. 
    when('/products/', {redirectTo: '/products/123'}). 
    when('/products/:productId', {templateUrl: 'products.html', controller: ProductsCtrl}) 
}]); 
+0

Phương pháp nạp quá tải FTW! –

6

Tôi có yêu cầu tương tự. Những gì tôi đã làm là tạo ra một chức năng để giải quyết. Một cái gì đó như bên dưới

myModule.config(['$routeProvider', function($routeProvider) { 
$routeProvider. 
when('/products/', resolveProduct()).    
when('/products/:productId', resolveProduct()) 
}]); 


function ProductsCtrl($scope, $routeParams) { 
$scope.productId = $routeParams.productId; 
} 

function resolveProduct() { 
    var routeConfig = { 
     templateUrl: 'products.html', 
     controller: ProductsCtrl, 
     resolve: { 
     productId: ['$route', function($route){ 
      var params = $route.current.params; 
      params.productId = params.productId || 123; 
     }] 
     } 
    } 

    return routeConfig; 
} 
2

Với url: "/ view /: id /: status?", Bạn có thể chỉ ra một tham số tùy chọn.

Chỉ cần nghĩ rằng ai đó có thể cần đến.

1

Không chắc chắn nếu câu hỏi này là cụ thể cho $routeProvider nhưng trong $stateProvider, bạn có thể đạt được điều này bằng cách

myApp.config(function($stateProvider) { 

    $stateProvider 
     .state('products', { 
      url: '/:productId', 
      templateUrl: "/dashboard/products.html", 
      controller: 'ProductController', 
      params: { 
       productId: { 
        value: "defaultValue", 
        squash: true // or enable this instead to squash `productId` when empty 
       } 
      } 
     }); 
}); 
Các vấn đề liên quan