Angular ui router parse query params into booleans

前端 未结 2 1433
没有蜡笔的小新
没有蜡笔的小新 2021-01-13 07:22

Consider such scenario of a state with query parameters. I\'d like to have them declared as flags so I can fetch then in the controller and get true, fals

相关标签:
2条回答
  • 2021-01-13 07:46

    Eventually the following has worked for me:

        var stringToBoolean = function (s) {
            if (typeof s != 'string') {
                return undefined
            }
    
            if (/1|true|TRUE/.test(s)) {
                return true
            } else if (/0|false|FALSE/.test(s)) {
                return false
            } else {
                return undefined
            }
         };
    
         $stateProvider.state('foo.bar', {
                     url: '/foobar?{flag1}',
                     ...
                     onEnter: function ($stateParams) {
                            $stateParams.flag1 = stringToBoolean($stateParams.flag1);
                     }
          });
    

    It doesn't feel super clean, I'd rather to have had this functionality integrated into ui-router but at least I was able in this way to solve this in the level of the states, without polluting my controllers with this logic.

    0 讨论(0)
  • 2021-01-13 07:54

    You should be able to use the bool as a type

    url: '/foobar?{flag1:bool}&{flag2:bool}',
    

    But we can even use our custom type (let's call it 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,0,1].indexOf(val) >= 0 },
     pattern: /bool|true|0|1/
    })
    }]);
    

    And the state def for url would be like this:

    url: '/foobar?{flag1:boolean}&{flag2:boolean}',
    

    and this should work:

    <a ui-sref="foobar({ flag1: 0, flag2:true })">
    <a ui-sref="foobar({ flag1: 1, flag2:false })">
    

    Here is plunker with example

    0 讨论(0)
提交回复
热议问题