如何设置 ui-router 嵌套视图

how to setup ui-router nested views

我正在尝试使用 ui-router 设置我的应用程序。我熟悉基本的嵌套视图,但我想做一些更复杂的事情。我有主要视图的基本设置。我想要一个聊天弹出窗口,它有自己的视图,独立于主视图。我希望能够导航主视图而不影响聊天弹出窗口中的状态。那么这是怎么做到的呢?我需要有一个抽象的聊天状态吗?然后从那里获得嵌套视图?

这是一个视觉效果。

这是一个笨蛋

plunker

 $stateProvider
    .state('root', {
      abstract: true,
      views: {
        '@': {
            template: '<ui-view />',
            controller: 'RootCtrl',
            controllerAs: 'rootCtrl'
        },
        'header@': {
            templateUrl: 'header.html',
            controller: 'HeaderCtrl',
            controllerAs: 'headerCtrl'
        },
        'footer@': {
            templateUrl: 'footer.html',
            controller: 'FooterCtrl',
            controllerAs: 'footerCtrl'
            }
       }
    })
    .state('root.home',{
        parent:'root',
        url:'/home',
        templateUrl:'home.html',
        controller: 'HomeController',
        controllerAs:'homeCtrl'
    })
     .state('root.about',{
        parent:'root',
        url:'/about',
        templateUrl:'about.html'
    });
});

使用不同 js 文件中的控制器创建聊天 service/function 并注入 index.html 和 script.js。使用 bootstrap 可折叠模式进行弹出式聊天。

看着@你的 plunkr,你在正确的轨道上,虽然通过 controllerAs 从 script.js 注入控制器对于更大的应用程序是不可扩展的。

相反,您可以为每个控制器和服务创建 js 文件并分离部分视图,只需要将服务和控制器注入 index.html 并在 stateprovider 函数中提及部分视图。

我建议,不要将页脚用作 ui-view,因为它完全独立于您的状态。

那怎么办?

将您的页脚部分作为模板并使用 ng-include 呈现您的页脚部分。

<footer ng-include="'/footer.html'"></footer>

并且在 footer.html 中,您可以指定页脚视图的控制器。

好处

  1. 无需处理每个状态的页脚
  2. 无需在每次状态更改时都传递聊天记录。

我不确定你是否想使用路由进行聊天,但有两种方式可能更适合你

  1. 使用像 facebook 一样点击时可以折叠和打开的模式 Modals for bootstrap

  2. 使用角度 ngHide ngShow

    对于在聊天中使用 at 子元素时的导航,您可以为聊天创建一个状态并将聊天导航嵌套到您的聊天状态中,这样任何状态更改都不会更改您的其他聊天状态。 这意味着您将需要使用 substate 概念 ui-router