首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

精通 MEAN 了解一个 MEAN 应用程序(5)研究 MEAN 堆栈的客户端

精通 MEAN 了解一个 MEAN 应用程序(5)研究 MEAN 堆栈的客户端

研究 MEAN 堆栈的客户端主页的关键内容(如清单 18 中的 app/views/layout.server.view.html 中定义)由 AngularJS 在客户端填充。
清单 18. app/views/layout.server.view.html
1
2
3
4
5
6
7
8
<body class="ng-cloak">
  <header data-ng-include="'/modules/core/views/header.client.view.html'"
  class="navbar navbar-fixed-top navbar-inverse"></header>
  <section class="content">
    <section class="container">
      {% block content %}{% endblock %}
    </section>
  </section>




回忆一下,app 目录包含 MEAN 应用程序的 Express 服务器端部分。从两点可以看出 header 在客户端由                AngularJS 管理。首先,无论何时看到 HTML 属性中有一个 ng 时,都表明它是由                    AngularJS 管理的。其次,更实用的一点是,包含所有服务器端代码的 app                目录并不包含模块目录。排除使用服务器端作为一种可能的解决方案后,就剩下使用 public 目录中的客户端源代码。如清单 19 所示,modules                目录明显位于 public 目录下。
清单 19.  public(客户端)目录结构               
1
2
3
4
5
6
7
$ tree -L 1 public/
public/

|--- application.js
|--- config.js
|--- lib
|--- modules




如果查看 lib 目录,就会看到一些第三方库:
清单 20.  第三方库的 public/lib                目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ tree -L 1 public/lib
public/lib
|--- angular
|--- angular-animate
|--- angular-bootstrap
|--- angular-cookies
|--- angular-mocks
|--- angular-resource
|--- angular-sanitize
|--- angular-touch
|--- angular-ui-router
|--- angular-ui-utils
|--- bootstrap
|--- jquery




回忆一下 bower.json 中指定的库。
但是,如果查看 modules 目录,就会发现 app/views/layout.server.view.html 中指定了                modules/core/views/header.client.view.html 模板。
清单 21. modules/core/views/header.client.view.html
1
2
3
4
5
6
7
8
9
10
<div class="container" data-ng-controller="HeaderController">
  <div class="navbar-header">
    <button class="navbar-toggle" type="button" data-ng-click="toggleCollapsibleMenu()">
      <span class="sr-only">Toggle navigation</span>
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
      <span class="icon-bar"></span>
    </button>
    <a href="/#!/" class="navbar-brand">MeanJS</a>
  </div>




如果将 class="navbar-brand" anchor 的值从 MeanJS                修改为其他值,那么此更改在保存文件后将会立即反映到浏览器中。但是到主 payload 的路径(主页的主要内容)更加迂回。再次查看                app/views/layout.server.view.html,如清单 22 所示。
清单 22. app/views/layout.server.view.html
1
2
3
4
5
6
7
8
<body class="ng-cloak">
  <header data-ng-include="'/modules/core/views/header.client.view.html'"
  class="navbar navbar-fixed-top navbar-inverse"></header>
  <section class="content">
    <section class="container">
      {% block content %}{% endblock %}
    </section>
  </section>




container 内包含一个名为 content 的                block。请记住 app/views/index.server.view.html:
1
2
3
4
5
{% extends 'layout.server.view.html' %}

{% block content %}
  <section data-ui-view></section>
{% endblock %}




这个 block content 包含一个空的部分,其中有一个 data-ui-view                属性。该属性用于客户端 AngularJS 路由器。查看                public/modules/core/config/core.client.routes.js,如清单 23 所示。
清单 23. app/views/index.server.view.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
'use strict';

// Setting up route
angular.module('core').config(['$stateProvider', '$urlRouterProvider',
  function($stateProvider, $urlRouterProvider) {
    // Redirect to home view when route not found
    $urlRouterProvider.otherwise('/');

    // Home state routing
    $stateProvider.
    state('home', {
      url: '/',
      templateUrl: 'modules/core/views/home.client.view.html'
    });
  }
]);




当 URL 为 / 时,客户端路由器会将 modules/core/views/home.client.view.html                模板(如清单 24 所示)插入到 app/views/index.server.view.html 部分,后者包含                data-ui-view 属性。模板的内容应当与位于 MEAN 应用程序主页时在浏览器中看到的内容相匹配。
清单 24. modules/core/views/home.client.view.html
1
2
3
4
5
6
7
<section data-ng-controller="HomeController">
    <h1 class="text-center">THANK YOU FOR DOWNLOADING MEAN.JS</h1>
    <section>
        <p>
          Before you begin we recommend you read about the basic building
          blocks that assemble a MEAN.JS application:
        </p>




结束语在本文中,详细了解了一个 MEAN 应用程序的所有关键部分。在服务器端,我们了解到,HTML 请求首先从 Express 路由开始,然后调用                Express 控制器函数,而后者将 JSON 数据与 Swig 模板合并,并返回到客户机。但是整个流程并没有在此终结。在客户端,AngularJS                路由获得 HTML 模板并将其插入到主页面中。
在下一篇文章中,将研究应用程序的文章部分,深入探讨 MongoDB 的角色以及                AngularJS。您还将了解如何在服务器端和客户端进行测试,确保最大程度减少生产环境中的异常行为。
那时,请尽情享受精通 MEAN 堆栈的快乐。
返回列表