Angular 路线就像另一条路线一样,没有 url 变化

Angular route act like another route without url change

我正在使用 Angular-UI 路由器,在我的项目中我有这样的页面结构:

- Main (/main)
-- Table (/main/table/:userid)
-- Info (/main/info)
-- About (/main/about)

万一用户进入 /main 我希望它表现得像用户点击 /main/table/1 而不会引起 url 变化。

我怎样才能做到这一点?

这是我的状态:

$stateProvider
.state('main', {
    'url': '/main',
    'templateUrl': '/pages/main.html',
    'controller': 'MainController',
    'resolve': { ... }
})
.state('main.table', {
    'url': '/main/table/:userid',
    'templateUrl': '/pages/table.html',
})
.state('main.info', {
    'url': '/main/info',
    'templateUrl': '/pages/info.html',
})
.state('main.about', {
    'url': '/main/about',
    'templateUrl': '/pages/about.html',
})

stateProviderurl属性负责浏览器URL路由机制。 stateProvider templateUrl 属性 是一个 html 局部视图模板,在我们的例子中将根据特定的 state 呈现它是 main.

$stateProvider
    .state('main', { // **main** is a state.
    'url': '/main', // **/main** is a preferred url you want to set in the browser.
    'templateUrl': '/main/table/1', // **/main/table/1** is a template to be rendered.
    'controller': 'MainController',
    'resolve': { ... }

})

我创造了working plunker here。诀窍是直接在主状态中重用 "main.table" 东西。

我们可以这样定义主状态:

  $stateProvider
    .state('main', {
      'url': '/main',

      views: {
        '': {
          'templateUrl': '/pages/main.html',
          'controller': 'MainController',
        },
        '@main': {
          'templateUrl': '/pages/table.html',
          'controller': 'TableController',
        }
      }
    })

这些几乎没有变化,只是/main被替换为url,它将被父级传递。

.state('main.table', {
    'url': '/table/:userid',
    'templateUrl': '/pages/table.html',
    'controller': 'TableController',
})
.state('main.info', {
    'url': '/info',
    'templateUrl': '/pages/info.html',
})
.state('main.about', {
    'url': '/about',
    'templateUrl': '/pages/about.html',
})

这将是 table 视图的控制器

.controller('TableController', function($scope, $stateParams) {
  $scope.userid = $stateParams.userid || 1;  
})

全部检查here

这里使用的技巧是:主状态确实有两个视图。其中之一是主要的 - 布局模板。第二个是立即将其他视图注入该布局。 via absolute naming '@main' (state main 未命名视图)

该视图(用于显示 table)与我们用于 main.table 状态的相同。我们只是检查,如果没有参数 userid - 1 被使用

在此处阅读有关此多视图的更多信息

View Names - Relative vs. Absolute Names

示例片段的小摘录:

$stateProvider
  .state('contacts', {
    // This will get automatically plugged into the unnamed ui-view 
    // of the parent state template. Since this is a top level state, 
    // its parent state template is index.html.
    templateUrl: 'contacts.html'   
  })
  .state('contacts.detail', {
    views: {
        ////////////////////////////////////
        // Relative Targeting             //
        // Targets parent state ui-view's //
        ////////////////////////////////////

        // Relatively targets the 'detail' view in this state's parent state, 'contacts'.
        // <div ui-view='detail'/> within contacts.html
        "detail" : { },            

        // Relatively targets the unnamed view in this state's parent state, 'contacts'.
        // <div ui-view/> within contacts.html
        "" : { }, 

        ///////////////////////////////////////////////////////
        // Absolute Targeting using '@'                      //
        // Targets any view within this state or an ancestor //
        ///////////////////////////////////////////////////////

        // Absolutely targets the 'info' view in this state, 'contacts.detail'.
        // <div ui-view='info'/> within contacts.detail.html
        "info@contacts.detail" : { }

        // Absolutely targets the 'detail' view in the 'contacts' state.
        // <div ui-view='detail'/> within contacts.html
        "detail@contacts" : { }

        // Absolutely targets the unnamed view in parent 'contacts' state.
        // <div ui-view/> within contacts.html
        "@contacts" : { }

        // absolutely targets the 'status' view in root unnamed state.
        // <div ui-view='status'/> within index.html
        "status@" : { }

        // absolutely targets the unnamed view in root unnamed state.
        // <div ui-view/> within index.html
        "@" : { } 
  });