我有一个棘手的问题,我暂时无法解决。
基本上,当我在某个$route
并且我确定$state.go(routeName, params);
时,我需要在网址上附加一个parameter
或多个parameters
。
另外,要注意路径也可以在没有参数的情况下访问,所以必须要干净。
我想实现这个结果:
localhost:4000
localhost:/4000/myRoute/myStuff/myParam
localhost:/4000/myRoute//
,请避免使用$state.go(myRoute)
。例如:
$state.go(myRoute, {
param1 : 'myStuff',
param2 : 'myParam'
});
function myRoute($stateProvider) {
$stateProvider
.state('myRoute', {
url: 'myRoute/{param1}{param2}',
parent: 'myParent'
. . .
})
}
可以工作,但是会给localhost:/4000/myRoute/myStuffmyParam
。
所以,我尝试使用/
作为分隔符url: 'myRoute/{param1}' + '/' + '{param2}'
它工作得很好,我得到localhost:/4000/myRoute/myStuff/myParam
。
但是,当然,即使没有参数,也会附加/
。
例如,执行$state.go('myRoute')
会导致localhost:/4000/myRoute//
明显错误。
现在,我告诉自己,好吧,如果我只是将它添加到param1
我将实现我所需要的。
所以,我尝试了
param1 : 'myStuff' + '/'
param1 : 'myStuff' + '\/'
param1 : 'myStuff/'
param1 : 'myStuff\/'
但所有都会导致相同的网址localhost:4000/myRoute/myStuff~2FmyParam
。
然而,如果我使用像-
这样的其他分隔符,它就可以了。
param1 : 'myStuff-'
会导致localhost:4000/myRoute/myStuff-myParam
修改
使用{param}
和:param
是一样的。参考angular-ui/ui-router URL Routing
我找不到任何解决方案,也会查看way to create optional parameter in url?提供的答案。尝试myRoute[/:param1[/:param2]]
也会产生错误。
修改
同时尝试param1%2F
或'param1' + '%2F'
也无效。
我分别得到~2F
& %252f
作为分隔符。同样做decodeURI('%2F')
导致同样悲惨的结果。
如有任何澄清,请发表评论。 提前谢谢。
答案 0 :(得分:3)
$stateProvider.state('state', {
url: "/state/:id/:name/:something",
templateUrl: "bla.html",
controller: 'BlaCtrl'
});
$state.go('state', {id: 1, name: 'pepe', something: 'nothing'});
这对我有用,产生: / state / 1 / pepe / nothing
答案 1 :(得分:1)
你不能创建一条母亲路线和一条儿童路线吗?这不可能吗?
答案 2 :(得分:1)
你不需要制造所有这类机器来达到你想要的效果。正如@trichetriche所说,你可以创建一组特定的子路径。
您需要修改$routeProvider
之类的内容:
//for the clean url - localhost:/4000/myRoute/
$stateProvider
.state('myRoute', {
url: 'myRoute/',
parent: 'myParent'
. . .
})
//for myStuff/param1 url - localhost:/4000/myStuff/param1
$stateProvider
.state('myRoute.myStuff', {
url: 'myStuff/{param1}', //also adding other params
parent: 'myRoute'
. . .
})
如果需要,您可以根据需要添加任意数量的儿童。
分别为$ state.go&#39>:
$state.go('myRoute');
$state.go('myRoute.myStuff', { param1 : 'HeyOhLetsGo' });