angularjs路由可以具有可选参数值吗?


166

我可以设置带有可选参数的路由(相同的模板和控制器,但是如果某些参数不存在,则应将其忽略)?

因此,只编写一个规则,而不是编写以下两个规则?

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

我在他们的文档中找不到任何内容。


[]在1.1.5版本中,它们将被忽略(不带)。
OZ_

真?我在1.1.5上,尝试使用代码[:userId],并且不忽略它们。
Alexandru R

尝试没有[]。看到这个提交:github.com/angular/angular.js/commit/…–
OZ_

糟糕,抱歉,它与$ resource有关,不确定它是否可以在路由中使用。对不起。
OZ_

1
如果g-orge的答案是好的,请您标注一下,这样人们就不必滚动整个内容来找到最佳答案了?
AlexStack

Answers:


243

看来Angular现在已对此提供支持。

从最新的(v1.2.0)文档中$routeProvider.when(path, route)

path可以包含带问号(:name?)的可选命名组


7
有什么方法可以避免使用斜杠吗?如果我的路线是:.when('/claims/documents/:CLAIMS_ID/:DOCUMENT_NAME?'...如果网址中没有结尾的斜杠,则不会匹配。如此/claims/documents/1234/匹配,但/claims/documents/1234不匹配。
James Bell

1
想知道是否有人对@JamesBell
Leiko 2015年

5
从Angular 1.3开始,以上注释中提到的尾部斜杠问题已修复。导航到/ claims / documents / 1234 /可以正常工作,就像/ claims / documents / 1234一样。简而言之,无论有没有斜杠,它都可以使用。
Judah Gabriel Himango 2015年

1
如果我的路线中有一个可选参数,我仍然会看到这种现象。例如:如果路由为:'/:classification?/ package / compare',而我尝试导航到URL“ / package / compare”,则它起作用。如果出于某种原因尝试使用“ / package / compare /”,则会将asci代码附加到分类中,或者将“ /%3f / package / compare”附加到实际路由中。
ruby_newbie 2015年

文档令人困惑。
奥利弗·迪克森

59

就像@ 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:'/'});
    }
);

2

实际上,我认为OZ_可能是正确的。

如果您有路线'/users/:userId'并导航至'/users/'(请注意尾随/),则$routeParams控制器中的对象应为userId: ""1.1.5中包含的对象。因此,没有一个参数userId没有被完全忽略,但是我认为这是最好的选择。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.