我一直在尝试使用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
看着'布尔'的方式 param类型是写的 我认为true / false应该在url上编码为0/1,但这不会发生。如果在$ state.go的params中使用0/1然后它工作并被解码为false / true但是为了进一步混淆问题,如果使用ui-sref则这不起作用。
希望这个 plunker 会更好地解释它。任何提示赞赏!
编辑:我使用bool param类型的目的是在$ stateParams中使用布尔数据类型
有一个 更新和工作的plunker与 boolean
自定义类型
在这种情况下,我们希望与...合作 布尔 喜欢类型,哪个
期望并接受:
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定义:
...
, url: '/foo/{isBar:boolean}'
...
注意:为什么 boolean
?不 bool
?因为 bool
已经注册 0|1
就目前我所记得的
核实 这里
原版的
使用“字符串”的简单解决方案 在这个更新的plunker,
... // states definitions
, url: '/foo/{isBar:(?:bool|true|0|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; }
你可以看到为什么这个失败,因为1和0不等于真或假。在我看来,它应该检查1和0,如果这是它最终转换为什么,但至少现在你知道它为什么行为它的行为。