Каков правильный способ использования параметра "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, если это то, к чему он в конечном счете преобразован, но по крайней мере теперь вы знаете, почему он ведет себя так, как он делает.