使用" bool"的正确方法是什么?使用ui-router的param类型?

时间:2014-11-27 20:19:12

标签: angularjs angular-ui-router

我一直在尝试使用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中以布尔数据类型结束

2 个答案:

答案 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,如果这是它最终转换为什么,但至少现在你知道它为什么行为它的行为。