Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 如何在UI路由器中简化URL_Angularjs_Nested_Angular Ui Router_State - Fatal编程技术网

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}”