在 UI 路由器中更新 url 从子状态到父状态的转换

Updating url on transition from child to parent state in UI router

我有一个 Angular (1.2.1) app 运行 UI-router (0.2.13),以及以下状态结构:

$stateProvider.state('home', {
        template: "<div home></div>",
        url: '/'
    }).state('home.geo', { 
        url:'/geo/{geo}' 
}

从父级到子级或具有不同 {geo} 参数值的子级之间的转换按预期工作。从子项到父项的转换有效——即模板的内容和 $state.current 按预期更改——但 URL 不会在浏览器中更新。

为了清楚起见,举个例子:我在 /geo/california 中,然后单击带有 ui-sref='home' 的按钮。我已确认正确的 href='#/' 已放置在按钮上,单击它会导致 $state 转换回主状态,但 /geo/california 仍保留在我的地址栏中。

我在这里错过了什么?

Update 回应@UlukBiy 的评论:不,home 在其模板中没有 ui-视图。 ui-视图位于其父视图的模板中:整体结构为:

<body> 
   <div app-nav></div>
   <div ui-view></div>
</body>

因此 home 指令被插入到 ui-view 中,但它不包含自己的 ui-views。那是我的问题吗?我是 UI-router 的新手,并且假设在我发布此内容时对状态与指令的作用存在一些低级误解。如果是,请帮我改正。

这个场景应该有效。有a working example (点击右上角的蓝色按钮到运行例子在单独的window,显示地址栏)

我稍微更新了你的状态定义:

$stateProvider
  .state('home', {
      url: "/",
      template: 'Home view <hr /> Geo view: <div ui-view></div>',
  })
  .state('home.geo', {
      url:'^/geo/{geo}',
      templateUrl: 'tpl.html',
  })

所有这些链接都按预期工作:

<a href="#/home">
<a href="#/geo/california">
<a href="#/geo/czechia">

<a ui-sref="home">
<a ui-sref="home.geo({geo:'california'})">
<a ui-sref="home.geo({geo:'czech'})">

所以,这里最重要的变化是对于子状态我们应该使用这个 url:

url:'^/geo/{geo}',

而不是 url:'/geo/{geo}'。检查文档:

Absolute Routes (^)

If you want to have absolute url matching, then you need to prefix your url string with a special symbol '^'.

检查工作示例here