【问题标题】:Angular ui.router. Deep nested routesAngular ui.router。深层嵌套路由
【发布时间】:2015-06-15 15:07:54
【问题描述】:

这是一个检查http://embed.plnkr.co/uVMlkk/preview的例子

当我们导航到“page2”路线时,会出现“嘿,我是子路线”的注释。 但是,一旦我们导航到其他任何地方,该注释就会永远消失。

目标是立即显示一些嵌套状态(作为默认状态)。

我认为应该有一些使用 $state.go() 的情况,但目前无法弄清楚。非常感谢任何帮助。

状态定义sn-p:

  .state('root.page2.tab', {
    url: '/:tabId',
    templateUrl: 'tpl.page2.tab.html',
    controller: 'Page2TabController'
  })

  .state('root.page2.tab.subroute', {
    url: '',
    templateUrl: 'tpl.page2.tab.subroute.html'
  })

'tpl.page2.tab.subroute.html'的内容

hey, I'm a subroute

相关控制器:

  .controller('Page2TabController', ['$scope', '$state', function($scope, $state) {
    $scope.tabId = $state.params.tabId;
    $state.go('root.page2.tab.subroute');
  }])

【问题讨论】:

    标签: angularjs nested angular-ui-router state


    【解决方案1】:

    有一个fixed version

    我从'root.page2.tab.subroute'中删除了网址

    .state('root.page2.tab.subroute', {
        //url: '',
        templateUrl: 'tpl.page2.tab.subroute.html'
    })
    

    而且因为父级已经定义了参数tabId

    .state('root.page2.tab', {
        url: '/:tabId',
        templateUrl: 'tpl.page2.tab.html',
        controller: 'Page2TabController'
    })
    

    我们必须在重定向中传递该参数:

    .controller('Page2TabController', ['$scope', '$state', function($scope, $state) {
        $scope.tabId = $state.params.tabId;
        // instead of this
        // $state.go('root.page2.tab.subroute');
        // we need this
        $state.go('root.page2.tab.subroute', $state.params);
     }])
    

    检查工作的固定版本here

    另一种方法 - 使用 redirectTo - 有 a working plunker

    一种方式,受此启发:

    Redirect a state to default substate with UI-Router in AngularJS

    可能是添加一个非常聪明但很小的重定向代码sn-p:

    .run(['$rootScope', '$state', function($rootScope, $state) {
        $rootScope.$on('$stateChangeStart', function(evt, to, params) {
          if (to.redirectTo) {
            evt.preventDefault();
            $state.go(to.redirectTo, params)
          }
        });
    }])
    

    然后像这样调整我们的状态:

    .state('root.page2.tab', {
        url: '/:tabId',
        templateUrl: 'tpl.page2.tab.html',
        controller: 'Page2TabController',
        redirectTo: 'root.page2.tab.subroute',
    })
    

    查看here

    【讨论】:

    • 感谢 Radim,抽出宝贵时间。我们快到了,但还没有。在您的示例中,有一种情况是我导航到“page2”,然后是“tabId1/2/3”,然后又是“page2”。 - 'root.page2.tab' 和 'root.page2.tab.subroute' 不再被激活。尽管一旦我们再次路由“page1”和“page2”,它就可以正常工作。 (两种方法的情况相同)。有什么想法吗?
    • 重点是:从标签 1 / 2 / 3 返回到 page2... 不会重新运行“Page2Controller”。这是他们的父母,所以当从孩子回来时......父母仍然在那里......而不是重新初始化。这其实很好。一旦选择了这个父母,你真的需要导航到某个孩子吗?例如到选项卡 2?只是问..你能确认这对你来说是必须的吗?
    • 请1分钟...我会解释
    • 检查另一个响应,它的 plunker...希望现在你会得到你需要的东西 ;)
    • 这是我实际尝试做的imgur.com/ltuLAo2。这就是我的“page2”布局应该是什么样子。左下列表就是我所说的“tabId1/2/3”。图表、过滤器和表格是“page2.tab”视图的一部分。事实上,表格嵌套在过滤器中,因此表格对应于“page2.tab.subroute”,并且无论在“页面”状态内导航如何,都应该整天可见。这是我第一次使用 ui.router 进行设计,所以我可能会犯一些错误。再次感谢您
    【解决方案2】:

    有一个技巧如何处理场景:

    如果发生这种情况,父母应该触发一些动作

    • 它被访问了,或者
    • 它再次到达,当从父状态的子导航返回

    在这种情况下,我们可以使用 "target (ui-view) for a child" 作为特殊 view 的位置,特殊的 controller强>。这将是

    • 创建父级后注入该位置并
    • 一旦离开孩子,再次重新注入该位置。在这种情况下,它将重新初始化。

    足够的解释。有a working plunker。有调整状态:

    .state('root.page2', {
        url: '/page2',
        views: {
          'content@root': {
            templateUrl: './tpl.page2.html',
            controller: 'Page2Controller'
          },
          '@root.page2': {
            template: '<div></div>',
            controller: 'RedirectorController'
          }
        }
    })
    

    所以,现在我们可以在 'RedirectorController'

    内部施展魔法了
    .controller('RedirectorController', ['$scope', '$state', 
       function($scope, $state) {
          $state.go('root.page2.tab', { tabId: $scope.activeTabId });
    }])
    

    查看action here

    阅读更多关于新视图/控制器从另一个(仅限视图层次结构的范围继承)这里

    【讨论】:

    • 不太明白为什么这个魔法有效,但它确实有效!必须阅读更多。谢谢拉迪姆。
    • 如果这有帮助的话... ;) 太好了。真的 ;) 在这里我尝试详细解释这个魔法stackoverflow.com/a/29115009/1679310 ...也许这可以帮助它是一个技巧...使用内置功能...遗憾的是没有魔法;)
    猜你喜欢
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多