是否有可能透明地转换URL参数?由于这有点难以解释,我将给出一个场景.我们有一个类似于这个的URL结构:
/shopping/nuts/:productId
/shopping/berries/:productId
/shopping/juice/:productId
我们在应用程序中显示的产品(由某些API提供)可能如下所示:
{ type: 'berry', price: 123, text: 'lorem ipsum', id: '12345' }
请注意单数和复数形式之间的差异:URL包含复数,例如’berries’,而我们的REST API提供的产品使用单一形式’berry’.
我们的州定义的部分看起来像这样:
.state('shop.product', {
url: '/shopping/:type/:productId',
templateUrl: 'type.html',
controller: 'TypeController'
})
问题:在每个控制器中,我需要调用一个函数将$state参数转换为单数形式(toSingular($stateParams.type)),并且在构建链接时,我需要反过来做同样的事情.这非常繁琐且容易出错.
所以,我理想的解决方案就是这样的
对于URL / shopping / berries / 12345,我将有一个$stateParams.type ===’berry’,当通过ui-sref =“shop.product({type:’berry’,id:’12345′)创建URL时})“我将再次获得URL / shopping / berries / 12345.
我一直在敲桌子,试图找到一个钩子,我可以整合这个逻辑而没有任何成功.任何反馈非常感谢!
最佳答案 您想要注册自定义参数类型.
https://ui-router.github.io/docs/latest/classes/url.urlmatcherfactory.html#type
您的参数类型应对URL中的值进行编码和解码.
要进行编码,请使用内部表示(nut,berry等)并返回要在URL中显示的字符串.
要解码,请从URL中获取字符串并返回内部值.
var productTypes = {
berry: ['berries', 'berry'],
nut: ['nuts', 'nut'],
juice: ['juice'],
}
$urlMatcherFactoryProvider.type('productType', {
encode: val =>
productTypes[val][0],
decode: string =>
Object.keys(productTypes).find(key => productTypes[key].indexOf(string) !== -1),
});
这是一个演示代码的plunker:http://plnkr.co/edit/Eed8h7U6x0j8RAWs7qT9?p=preview