Angularjs 如何在UI路由器中简化URL
这是我的Angularjs 如何在UI路由器中简化URL,angularjs,nested,angular-ui-router,state,Angularjs,Nested,Angular Ui Router,State,这是我的$stateProvider配置: .state('itemDetail', { abstract: true, url: '/itemDetail/general/:itemid', controller: 'ItemDetailsController', templateUrl: './partials/itemDetails.html' }) .state('itemDetail.general', { url: "", contro
$stateProvider
配置:
.state('itemDetail', {
abstract: true,
url: '/itemDetail/general/:itemid',
controller: 'ItemDetailsController',
templateUrl: './partials/itemDetails.html'
})
.state('itemDetail.general', {
url: "",
controller: 'ItemDetailsController',
templateUrl: "./partials/itemDetails.General.html"
})
.state('itemDetail.file', {
url: "/file/:itemid",
controller: 'ItemDetailsController',
templateUrl: "./partials/itemDetails.File.html"
})
用户可以使用#/itemdail/general/96045
查看项目,并可以单击链接查看文件附件。现在它可以工作了,但是现在文件的URL是\itemdail/general/96045/file/96045
是否可以将文件的URL设置为
#/itemdail/file/96045
?是的,您需要将状态设置为
.state('itemDetail.file', {
url: '/{itemId}',
controller: 'ItemDetailsController',
templateUrl: 'partials/itemDetails.html'
})
好吧,我会和一个父母一起去,只有一个孩子。有
这将是新的一个子状态itemDetail。键入:
.state('itemDetail', {
abstract: true,
url: '/itemDetail',
controller: 'ItemDetailsController',
templateUrl: 'partials/itemDetails.html'
})
.state('itemDetail.type', {
url: "/:type/:itemid",
controller: 'ItemDetailsController',
templateProvider: ['$stateParams', '$templateRequest',
function($stateParams, $templateRequest) {
var url = "partials/itemDetails.General.html";
if($stateParams.type === "file"){
url = "partials/itemDetails.File.html"
}
return $templateRequest(url);
}],
})
我们在这里使用$stateParams.type
来决定加载哪个模板(以及$templateRequest
以从angula内置缓存中获益)
这将是调用html:
<a ui-sref="itemDetail.type({type:'general', itemid:1})">
<a ui-sref="itemDetail.type({type:'file', itemid:22})">
在itemdail
状态中将abstract
设置为true
,将始终使用在该状态中定义的url
在任何子状态前加上前缀(即/itemdail/general/
)。您可以将itemdail
状态中的url
设置为/itemdail
,将itemdail.general
状态中的url
设置为/general/:itemId
。如果这样做,您显然必须调整模板标记链接。但是在这种情况下,如果我使用ui sref
进入视图,它会起作用,但是如果我在浏览器中直接打开itemDetails/general/100
,则$stateParams
是未定义的。在这种(不工作)的情况下,ItemController只调用了一次(对于一个视图),谢谢,但是如果我没有正确安装,那么只有当所有状态都有一个(并且相同)控制器时,它才会工作。但这不是我的情况(一般来说)。令人惊讶的是,我们可以对控制器使用相同的技巧-。。。coool;)(我刚刚用了你的代码片段..但是UI路由器的内置功能…太棒了)谢谢。但我还有一个问题:)。我需要在partials/itemDetails.html
中有itemid。如果我为itemdail
状态设置了url:'/itemdail'
,我的控制器中就不会有这个变量。解决这个问题的好方法是什么?很高兴看到这一进展;)因为我们的方法是正确的。。。我们可以把参数移到父状态。。这不是一个问题:但这意味着,当任何参数发生更改时,即使是父级也会重新加载;)祝您好运,UI路由器sirI有错误:无法解析“.file”来自状态“itemDetail”
在这种情况下,我想您只需将url设置为这种格式url:“/{itemId}”