Передать сложный объект в UI-sref params
мне нужен url сборки, как это: - список?фильтр[статус]=1&фильтр[тип]=2
Я:
ссылки:
<a ui-sref="list({filter: {status: 1, type:2}})">List</a>
(передать сложный объект в params, если передать простой объект - {filter: 1} - это нормально, но мне это нужно)
состояние:
.state('list', {
url: '/list?filter',
…
})
в общей сложности я получаю url-адрес:
/list?filter=[object Object]
демо:http://plnkr.co/edit/wV3ieKyc5WGnjqw42p7y?p=preview
как я могу исправить это?
1 ответов
на UI-Router
теперь поставляется с поддержкой custom types
параметрам. Есть обновленная и рабочая версия ваш plunker.
Итак, мы можем настроить состояние def следующим образом:
app.config(function($stateProvider) {
$stateProvider.state('list', {
url: 'list?{filter:CoolParam}',
как мы видим, фильтр типа CoolParam
. Здесь мы определим это:
app.config(['$urlMatcherFactoryProvider', function($urlMatcherFactory) {
$urlMatcherFactory.type('CoolParam',
{
name : 'CoolParam',
decode: function(val) { return typeof(val) ==="string" ? JSON.parse(val) : val;},
encode: function(val) { return JSON.stringify(val); },
equals: function(a, b) { return this.is(a) && this.is(b)
&& a.status === b.status && a.type == b.type },
is: function(val) { return angular.isObject(val)
&& "status" in val && "type" in val },
})
}]);
и теперь {{$stateParams}}
такой ссылки:
<a ui-sref="list({filter: {status: 1, type:2}})">Click me to see params</a>
будет возвращение:
{"filter":{"status":1,"type":2}}
примечание: в этом случае я облегчил свою жизнь и просто преобразовал json в строку. Это означает, что url закодированный param будет выглядеть так:
#/list?filter=%7B%22status%22:1,%22type%22:2%7D
это {"status":1,"type":2}
но мы можем обеспечить также другие пути как выразить наш объект фильтра
проверить здесь
также связанные вопросы и ответы:
- Угловое ui router анализирует параметры запроса в логические
- как правильно использовать тип param "bool" с ui-маршрутизатором?
Итак, вышеуказанное решение хорошо работает с фильтром в качестве JSON. Но в случае, если мы должны иметь url, как это ?filter[status]=1&filter[type]=2
, мы должны определить состояние по-разному. Каждый параметр должен быть объявлен как отдельный простой тип
$stateProvider.state('list2', {
url: 'list2?state&type',
})
но в этом случае у нас было бы так ?status=1&type=2
. Этот отображение также является частью этого plunker.