考虑具有查询参数的状态的这种情况.我想将它们声明为标志,以便我可以在控制器中获取并获取true,false或undefined
$stateProvider.state('foo.bar',{ url: '/foobar?flag1&flag2',templateUrl: 'foo/bar/template.tpl.html',controller: 'FooBarCtrl' }); myModule.controller('FooBarCtrl',function($stateParams){ $stateParams.flag1 <<--- is string but can it be of type bool? $stateParams.flag2 <<--- is string but can it be of type bool? });
一些URL示例:
/foobar?flag1=true -->> should yield {flag1: true,flag2: undefined} /foobar?flag2=false -->> should yield {flag1: undefined,flag2: false} /foobar?flag1=false&flag2=true -->> should yield {flag1: false,flag2: true} /foobar?flag1=1&flag2=0 -->> should yield {flag1: true,flag2: false} etc...
目前$stateParams只提供字符串.有没有让路由器解析params作为标志?这比在控制器中手动解析要优雅得多.
解决方法
您应该能够将bool用作类型
url: '/foobar?{flag1:bool}&{flag2:bool}',
但我们甚至可以使用我们的自定义类型(让我们称之为boolean):
app.config(['$urlMatcherFactoryProvider',function($urlMatcherFactory) { $urlMatcherFactory.type('boolean',{ name : 'boolean',decode: function(val) { return val == true ? true : val == "true" ? true : false },encode: function(val) { return val ? 1 : 0; },equals: function(a,b) { return this.is(a) && a === b; },is: function(val) { return [true,false,1].indexOf(val) >= 0 },pattern: /bool|true|0|1/ }) }]);
url的状态def将是这样的:
url: '/foobar?{flag1:boolean}&{flag2:boolean}',
这应该工作:
<a ui-sref="foobar({ flag1: 0,flag2:true })"> <a ui-sref="foobar({ flag1: 1,flag2:false })">