Каков правильный способ использования параметра "bool" с ui-router?

Я пытаюсь использовать типы параметров с помощью ui-router и не могу их правильно понять.

$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' тип параметра, я полагаю, что true/false должно быть закодировано как 0/1 на url, но этого не происходит, Если используется параметр 0/1 в параметрах для $state.go, то он работает и декодируется как false/true, но для дальнейшего путаницы проблемы это не сработает при использовании ui-sref.

Надеюсь, этот plunker будет лучше объяснять. Любые подсказки оценены!

Изменить: Моя цель использования типа параметра bool состоит в том, чтобы в итоге получить логический тип данных в $stateParams

Ответ 1

Существует обновленный и рабочий плунжер с настраиваемым типом 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 внутри любого состояния:

...
, url: '/foo/{isBar:boolean}'
...

ПРИМЕЧАНИЕ: почему boolean? не bool? Поскольку bool уже зарегистрирован для 0|1, насколько я помню

Отметьте здесь

Оригинал

простое решение, работающее со строками в этом обновленном плунжере,

... // states definitions
, url: '/foo/{isBar:(?:bool|true|0|1)}'

Ответ 2

Итак, после копания нескольких файлов я нашел, почему последние два способа (0,1) не работают в ui-sref. Этот вызов вызывается в строке 106 stateDirectives.js: newHref = $state.href(ref.state, params, options);

Это вернет null в случае использования 1 и 0. И так как за этим вызовом следует следующее:

 if (newHref === null) {
      nav = false;
      return false;
    }

ссылка никогда не производится. Теперь возвращается причина null. state.href вызывает urlRouter.href. Внутри это вызов для проверки параметров. Валидация такова: result = result && (isOptional || !!param.type.is(val));

когда вы смотрите на функцию bool (is: function(val) { return val === true || val === false; }), вы можете понять, почему это не удается, поскольку 1 и 0 не равны true или false. По-моему, он должен также проверить на 1 и 0, если это то, к чему он в конечном счете преобразован, но по крайней мере теперь вы знаете, почему он ведет себя так, как он делает.