2013-07-07 27 views
151

我可以設置可選的PARAMS(相同的模板和控制器的路線,但如果他們不存在?有些PARAMS應該被忽略angularjs路由可以有可選的參數值嗎?

因此,而不是寫以下兩條規則,只有一個?

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

像這樣的東西([此參數是可選])

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

我找不到自己的文檔中任何事情。

+0

它們將在1.1.5版本中被忽略(不帶'[]')。 –

+0

真的嗎?我在1.1.5上,嘗試了代碼[:userId],並且不會忽略它們。 –

+0

嘗試不使用'[]'。看到這個提交:https://github.com/angular/angular.js/commit/53061363c7aa1ab9085273d269c6f04ac2162336 –

回答

225

它看起來像Angular現在支持這一點。

從最新的(V1.2.0)文檔爲$routeProvider.when(path, route)

path可以包含可選的命名組帶有問號(:name?

+7

任何避免使用尾部斜線的方法?如果我的路線是:'.when('/ claims/documents /:CLAIMS_ID /:DOCUMENT_NAME?'...'如果url沒有結尾斜槓,它將不匹配所以'/ claims/documents/1234 /'匹配,但是'/ claims/documents/1234'沒有。 –

+1

想知道是否有人對@JamesBell報告的問題有解決方案 – Leiko

+5

從Angular 1.3開始,上述評論中提到的斜線問題是正如/ claim/documents/1234一樣,導航到/ claims/documents/1234 /工作正常,簡而言之,它可以使用或不使用尾部斜槓 –

2

其實我認爲OZ_可能有點正確。

如果你有路線'/users/:userId'並導航到'/users/'(注意尾部/),你的控制器中的$routeParams應該是1.1.5中包含userId: ""的對象。所以沒有參數userId沒有被完全忽略,但我認爲這是你最好的。

53

像@ G-eorge提,你可以把它像這樣:

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

你也可以儘可能多地做你需要的可選參數。

8

請參閱@jlareau這裏回答:https://stackoverflow.com/questions/11534710/angularjs-how-to-use-routeparams-in-generating-the-templateurl

您可以使用函數生成模板字符串:

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您可以使用壁球選項,得到的回答在這個崗位: 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

這隻適用於$ stateProvider,而不適用於Angular的$ routeProvider –

+0

我將它用於$ stateProvider。不知道與$ routeProvider的兼容性。 – oyaebunterkrah

+5

@oyaebunterkrah如果你不知道,那麼請不要回答。 –