我们也有一个系统angular用在应用中单页。正确angular做一些定制。集成seajs。不实用angular自己的模块管理。

只要angular也可单独使用在,一个较小的系统新开发,我不会用前js模块管理,但是,简单地集成ejs和angular,一个简单的demo

流程

首先是express的一个服务,用于跳转到ejs。该服务类似于struts2里的action类:

function myAccount(req, res, next){

    res.render("binding_list", {layout:"storeadmin_layout", menu:"myAccount"});
}

通过http client发送GET请求到地址/svc/weixin/myAccount,就会调用该服务,该服务在服务端准备数据之后,调用express的render函数,跳转到ejs。以下是ejs的代码。.ejs相当于jsp文件。都是一个服务端模板

<%- Loader().js('/weixin/weixin.js').done(config) %>

<div ng-controller="WeixinController">

    <span ng-if="hasBinding">已绑定</span>
<span ng-if="!hasBinding">未绑定</span> </div>

在.ejs里能够写javascript代码。经过ejs引擎渲染之后。生成html页面到client,response body是:

<script src="/weixin/weixin.js?

v=1407754967801"></script>

<div ng-controller="WeixinController">

    <span ng-if="hasBinding">已绑定</span>
<span ng-if="!hasBinding">未绑定</span> </div>

上面这段html片段,里面已经包括了angular标签。可是angular还没有在client(浏览器里)运行。

然后浏览器解析到<script>标签。又去请求载入weixin.js文件,这个文件中放的才是angular的代码:

function WeixinController($scope){

    $scope.name = "kyfxbl";

    $.get("/svc/weixin/checkBinding", function(res){
$scope.hasBinding = res.flag;
$scope.$digest();
});
}

这时候,浏览器已经载入了angular.js和weixin.js,这2个文件中的代码。都是在浏览器里运行的。和服务端的express和ejs已经没有关系了 。

后面就是angular在起作用,对html文件再次编译,得到的就是终于呈现给用户的界面

这个过程分为2个阶段,第一个阶段跑在node里。主要是ejs引擎起作用,把.ejs文件渲染成html文件,发响应给回浏览器。第二个阶段跑在浏览器里,主要是angular起作用。把html里的变量,替换为$scope中的模型。

所以这里有2次变量替换的过程,在服务端是把<%= %>替换成render函数传递的模型。在client是把{{ }}替换成&scope上挂载的模型

server端传递变量

主要easy混淆的地方在于。假设想在server端把值写到weixin.js里该怎么做

比方说,在.ejs里有这么一个表达式:

{{ name }}

name是在浏览器里由angular编译替换的,所以weixin.js里,就须要有这种代码:

$scope.name = "kyfxbl";

可是假设name是须要node从数据库中读出来的,那么就有2种做法:

一种是把js嵌入到.ejs中(就不须要单独的weixin.js了):

<script>

    function WeixinController($scope){
$scope.name = "<%= name %>";
}
</script> <div ng-controller="WeixinController"> {{ name }} </div>

可是这样的方式我并不推荐。主要是有2个问题:

1、把js代码直接嵌在html里。这样的做法非常不好。

由于复杂一点的页面,<script>里的内容会变得非常长。非常难维护。并且js压缩工具。也不优点理这样的情况。最佳实践是把js和html分离开

2、render传过来的name变量。还须要手工地加上""。否则的话就会报错。<script>里到处都须要这么处理,非常easy出错,定位起来也非常麻烦

所以最好是採用另外一种方式,还是把.ejs和weixin.js分离开,weixin.js里初始化angular controller的时候,再次去服务端请求须要的变量:

function WeixinController($scope){

    $scope.name = "kyfxbl";

    $.get("/svc/weixin/checkBinding", function(res){
$scope.hasBinding = res.flag;
$scope.$digest();
});
}

这样做的坏处是http的请求数会变得比較多(第一种方式能够在接受请求的时候。把须要的变量都准备好写到.ejs里)。只是能够通过合并接口等方式,降低http请求的数目。

我感觉比好js代码嵌入html在

版权声明:本文博客原创文章,博客,未经同意,不得转载。

集成ejs和angular的更多相关文章

  1. 手把手教你用ngrx管理Angular状态

    本文将与你一起探讨如何用不可变数据储存的方式进行Angular应用的状态管理 :ngrx/store——Angular的响应式Redux.本文将会完成一个小型简单的Angular应用,最终代码可以在这 ...

  2. ApacheCN Angular 译文集 20211114 更新

    Angular 专家级编程 零.前言 一.架构概述和在 Angular 中构建简单应用 二.将 AngularJS 应用迁移到 Angular 应用 三.使用 Angular CLI 生成具有最佳实践 ...

  3. Angular核心概念

    一.集成开发环境@angular/cli IE8之后才有debugger工具 2009,nodejs发布,前端Big Bang 1.1 基于NodeJS的工具链 打包工具 grunt 对js代码做合并 ...

  4. (转)构建自己的AngularJS,第一部分:Scope和Digest

    原翻译链接:https://github.com/xufei/Make-Your-Own-AngularJS/edit/master/01.md 原文链接:http://teropa.info/blo ...

  5. Angularjs 脏值检测

    文章转自:http://www.ituring.com.cn/article/39865 构建自己的AngularJS,第一部分:Scope和Digest 原文链接:http://teropa.inf ...

  6. DevExpress v18.2新版亮点——DevExtreme篇(四)

    行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍新版本新功能.本文将介绍了DevExtreme Complete Sub ...

  7. AngularJS的Scope和Digest

    Angular是一个成熟和强大的JavaScript框架.它也是一个比较庞大的框架,在熟练掌握之前,需要领会它提出的很多新概念.很多Web开发人员涌向Angular,有不少人面临同样的障碍.Diges ...

  8. MEAN 26

    MEAN 纸质书,第26章内容,使用社交媒体账户作为身份验证来源 先不看. 功能:登录,注册 或者 用户,身份认证和会话管理 功能描述:用户注册,登录,查看,编辑信息,logout. 1.expres ...

  9. popup定位引擎popper.js介绍

    https://medium.com/@FezVrasta/popper-js-v1-5e8b3acd888c https://survivejs.com/blog/popper-interview/ ...

随机推荐

  1. DOM解析XML文件实例

    XML文件: response: <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www ...

  2. 源代码编译安装 PHP5.5.0,解决curl_exec訪问HTTPS返回502错误的问题

    近期碰到一个奇怪的问题. PHP使用 curl_exec 訪问 HTTPS 网页时, 返回502错误, 訪问HTTP网页时没有问题,  用   echo   phpinfo() ;  查看. 支持op ...

  3. 编译gRPC

    编译gRPC 目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 无论通过哪种语言调用gRPC,都必须要编译gRPC,因为生成proto访问类时,除了产生标准的数据定义 ...

  4. CodeBlocks暴力恢复默认设置

    昨天,我不知道怎么去CodeBlocks干净的界面使自己都不知道怎么走.然后找到默认设置恢复方法,找不到.然后,我用了一个恢复方法暴力,卸载重装,有一点须要注意.卸载后CodeBlocks的配置文件还 ...

  5. java大全经典的书面采访

    果学网  -专注IT在线www.prismcollege.com 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面.以便更充分地注意与当前目标有关的方面.抽象并 ...

  6. Portlet MVC框架

    Portlet MVC框架 16.1. 介绍   Spring不仅支持传统(基于Servlet)的Web开发,也支持JSR-168 Portlet开发. Portlet MVC框架尽可能多地采用Web ...

  7. HDU 4337 King Arthur&#39;s Knights 它输出一个哈密顿电路

    n积分m文章无向边 它输出一个哈密顿电路 #include <cstdio> #include <cstring> #include <iostream> usin ...

  8. ubuntu10.10和windows双系统启动顺序的修改

    我想大部分童鞋装ubuntu的时候,硬盘上的windows肯定还是保留着的,启动电 脑时可以选择,想进windows就进windows,想进ubuntu就进ubuntu.但装完ubuntu后,它默认启 ...

  9. Android呼叫开发系列WebService

    我在学习Android第一个问题是在发展进程中遇到Androidclient究竟是怎么用server与数据库交互它?问题是,我有初步接触Android这困扰了我一个非常大的问题.天直到几年前,我突然想 ...

  10. Android含文档server结束(client UI接口异步请求的一部分)三

    在本文中,AsyncTask为了实现异步请求,详细代码如下所示的: public class downloadActivity extends Activity { private TextView ...