【问题标题】:How to bootstrap component based angular 1 application?如何引导基于组件的 Angular 1 应用程序?
【发布时间】:2017-04-19 07:28:22
【问题描述】:

使用 angular 1.6,这里是我需要的组件:

+-------------------+
|side|              | 
|bar |              |
|... |     view     |
|... |              |
|... |              |
+-------------------+
  • 侧栏:放置在左侧。使用 ng-repeat 和动态更新。
  • 查看:应用程序的其余部分。模板是静态的,但单击侧栏时内容会发生变化。

当用户单击侧栏的每个列表<li> 时,它会更新视图。只有视图内容/模型会改变。不是 html 模板。

重要提示:我只是不想在<body> 中编写代码。希望在一个 html 文件中有侧边栏,并在另一个与他们的控制器关联的文件中查看,并通过 ng-view in <body> 呈现整个应用程序。

侧边栏会动态更新,因此我无法在 config() 中为每个指定状态。

赞赏任何其他标准架构。

【问题讨论】:

  • 这对于 Stack Overflow 来说实在是太宽泛了。到目前为止,您尝试过什么?
  • @DavidL 我只需要有关架构的指导。还没有开始,因为我不想在正文中编写代码。我正在删除进度条部分。
  • 可以理解,但这不是 Stack Overflow 的用途。这是针对具体问题的。这取决于意见(建筑总是如此),并且过于宽泛,无法提供具体的答案。
  • @DavidL 只需简单的口头回答即可。我可以用 ng-repeat 编写侧栏并通过 ng-view 更新视图,但我认为在正文中编写详细代码不是一个好主意。我认为它应该在另一个要通过 ng-view 呈现的 html 文件中。如果我错了,请纠正我。

标签: javascript angularjs architecture single-page-application ng-view


【解决方案1】:

如 cmets 中所述,可以选择多种架构和框架来实现您正在寻找的模板类型。我将提供一个基本示例,该示例基于我过去使用的角度,使用 ui-router 和子/嵌套视图。

假设您有一个 index.html,例如:

<body>
    <div ui-view="header" class="header"></div>
    <div ui-view="main" class="main"></div>
    <div ui-view="footer" class="footer"></div>
</body>

索引页只有最高级视图的布局,即页眉、内容和页脚。如果您不需要页眉和页脚,您可以忽略/删除它。现在,您正在寻找的布局,左侧是侧栏,右侧是内容,将被放置在 ma​​in 视图中。为此,让我们声明另一个将定义此结构的页面,将其命名为landing.html(为简单起见使用引导程序):

<div class="container-fluid">
  <div class="row landingContainer">
    <div class="col-md-2 col-sm-4 col-xs-3 sidebarSection">
      <div class="row item" ng-click="landing.changePage('content1')">
        <span>Show Content 1</span>
      </div>
      <div class="row item" ng-click="landing.changePage('content2')">
        <span>Show Content 2</span>
      </div>
      <div class="row item" ng-click="landing.changePage('content3')">
        <span>Show Content 3</span>
      </div>
    </div> 
    <div class="col-md-10 col-sm-8 col-xs-9 contentSection">
      <div ui-view="content"></div>
    </div> 
  </div>
</div>

您可以将此页面视为布局的根。该页面使用引导列分为左右部分。左侧包含所有内容视图的列表。你可以使用 li,我只是更喜欢 div。右侧将是页面的动态部分所在的位置,内容将根据在侧栏中选择的项目而变化。每个组件视图都是着陆页的子视图,它继承父视图的所有特性,然后将自己的内容添加到 ui-view 中,类似于landing.html 将其内容添加到 ma​​in用户界面视图。现在让我们看看使这一切工作的 ui-router 配置。

function routerConfig($stateProvider, $urlRouterProvider) {
    $stateProvider
      .state('landing', {
        url: '/landing',
        views: {
         'header': {
            templateUrl: 'app/components/header/headerPrivate.html',
            controller: 'HeaderController',
            controllerAs: 'header'
          },
          'main': {
            templateUrl: 'app/landing/landing.html',
            controller: 'LandingController',
            controllerAs: 'dashboard'
          },
          'footer': {
            templateUrl: 'app/components/footer/footer.html',
            controller: 'FooterController',
            controllerAs: 'footer'
          }
        }
      })
      .state('landing.content1', {
        url: '/content1',
        views: {
         'content': {
            templateUrl: 'app/content1/content1.html',
            controller: 'Content1Controller',
            controllerAs: 'content1'
          }
        }
      })
      .state('landing.content2', {
        url: '/content2',
        views: {
         'content': {
            templateUrl: 'app/content2/content2.html',
            controller: 'Content2Controller',
            controllerAs: 'content2'
          }
        }
      })
      .state('landing.content3', {
        url: '/content3',
        views: {
         'content': {
            templateUrl: 'app/content3/content3.html',
            controller: 'Content3Controller',
            controllerAs: 'content3'
          }
        }
      })
    $urlRouterProvider.otherwise('/');
}

您会注意到,着陆页路由定义了 3 个主要视图的配置,即页眉、主视图和页脚。 url 路径将是 /landing。然后 content1、content2 和 content3 被定义为子项,通过使用点符号将它们嵌套在landing 中:landing.content1。然后,每个孩子的 url 路径将解析为 /landing/content1/landing/content2landing/content3。因此,现在无论何时您导航到这些位置,只有该特定子项的内容将嵌套在登录页面“内容”ui-view 中,并且页面的其余布局保持不变。

为了完整起见,着陆控制器的外观如下:

function LandingController($state) {
    var vm = this;

    vm.changePage = function(page){
        $state.transitionTo('landing.'+page, null, null);
    }    
}

【讨论】:

  • 这是一个很好的解释。谢谢你。这没有涵盖的是侧栏填充了 ng-repeat 并且它是动态的。我不知道如何在 config() 中设置动态状态,我认为它不建议在 angular 中使用。你也有什么解决办法吗?谢谢。 :)
  • 侧边栏中的动态列表如何影响内容视图?您是否也在动态获取 html 以显示在内容区域中?
  • 侧边栏的每个项目都有一个 ID 和一些摘要信息。当您单击它时,它应该根据该项目更新视图。该视图包含更多信息,包括一些图表、其他表格等。没有什么是静态的。基本上每次点击左侧边栏时,我都必须打一个新电话。由于视图是动态的,我无法在 config() 中为每个视图提供状态。所以我认为答案是肯定的。
  • 因此,如果您有视图的动态数据,那很好,您可以根据需要使用角度指令使用单个视图显示所有数据。假设多个视图在它们之间保持一些相似的结构。但是,如果一切都不同并且布局本身动态而剧烈地变化,您依赖某些后端来提供 html,那么您实际上可以在运行时动态注册 ui 路由器状态。看看这个答案:stackoverflow.com/a/25872852/7852085
  • 实际上并非如此,问题在于侧边栏的状态,其中每个组件本身都有许多细节,并且 html 模板也比为此创建指令更复杂。它不仅仅是一个简单的列表。
猜你喜欢
  • 2017-01-11
  • 2016-05-23
  • 1970-01-01
  • 2020-09-25
  • 2019-04-29
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
相关资源
最近更新 更多