我一直在尝试使用ui-router的param类型,但似乎无法使它们正确。
$stateProvider.state({
name: 'home.foo',
url: '/foo/{isBar:bool}',
controller: function() { },
templateUrl: 'foo.html'
});
我的期望是我应该能够像这样过渡到那个州:
$state.go(home.foo, { isBar: false })
或
ui-sref="home.foo({ isBar: false })"
然而在结果$ stateParams中你会看到isBar:true
看着' bool' param type is written我认为true / false应该在url上编码为0/1,但这并没有发生。如果在$ state.go的参数中使用0/1那么它可以工作并被解码为false / true但是为了进一步混淆这个问题,如果使用ui-sref,这不起作用。
希望这个plunker会更好地解释它。任何提示赞赏!
编辑:我使用bool param类型的目标是在$ stateParams中以布尔数据类型结束
答案 0 :(得分:11)
有一个updated and working plunker with boolean
自定义类型
如果我们想使用类似 bool 的类型,那么 期待并接受:
true
,false
,0
,1
我们只需注册我们的自定义类型:
app.config(['$urlMatcherFactoryProvider', function($urlMatcherFactory) {
$urlMatcherFactory.type('boolean',
// our type custom type
{
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,0,1].indexOf(val) >= 0 },
pattern: /bool|true|0|1/
})
}]);
然后我们可以在任何州内使用此网址定义:
...
, url: '/foo/{isBar:boolean}'
...
注意:为什么boolean
?不是bool
?因为bool
已经为0|1
注册了,因为我记得
检查here
ORIGINAL
使用“字符串”in this updated plunker,
的简单解决方案... // states definitions
, url: '/foo/{isBar:(?:bool|true|0|1)}'
答案 1 :(得分:1)
因此,在挖掘多个文件后,我发现为什么最后两种方式(0,1)不能在ui-sref中工作。在stateDirectives.js的第106行有这个电话:newHref = $state.href(ref.state, params, options);
在使用1和0的情况下,这将返回null。由于上面的调用后面是:
if (newHref === null) {
nav = false;
return false;
}
永远不会有链接。现在,返回原因null。 state.href调用urlRouter.href。在里面是一个验证params的调用。验证如下:result = result && (isOptional || !!param.type.is(val));
当你查看bool(is: function(val) { return val === true || val === false; }
)的is函数时,你可以看到为什么这个失败为1和0不等于true或false。在我看来,它应该检查1和0,如果这是它最终转换为什么,但至少现在你知道它为什么行为它的行为。