我们也有一个系统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. Android 访问Android Wear数据层Api——同步Data Items

    Data Items它被用来同步手机和wear数据接口,一个Date Items通常包含以下几个部分: Payload 字节数组.无论你需要设置数据类型,我们同意对象序列化和反序列化,大小不能超过10 ...

  2. mysql xtrabackup增量备份

    mysql 增量备份策略 周一全备,其他增量备份,根据业务需要,设定保留日期,如保留一月. 增量备份步骤; 1 创建全备 2 根据全备目录,创建增量备份 3 第二次增量备份根据第一次增量备份目录,依次 ...

  3. JAVA insert() 插入字符串 reverse() 颠倒 delete()和deleteCharAt() 删除字符 replace() 替换 substring() 截取子串

    insert() 插入字符串 StringBuffer insert(int index,String str) StringBuffer insert(int index,char ch) Stri ...

  4. 两个实验操作系统-ubuntu在安装配置pintos

    安前两次莫名其妙, 蛋疼的实验操作系统.. 首先下错了总结第一次. 使用最后gdb调试pintos什么时候, 这个错误将被报告: bochsrc.txt:8: Bochs is not compile ...

  5. hdu5384(trie树)

    hdu5384 给定n个字符串Ai 给定m个字符串Bi 问所有的Bi在每个Ai中出现了多少次 很显然,对Bi建Trie图,然后每次用Ai去匹配的时候,不断查找当前匹配串的最长后缀,这样就能找到答案了 ...

  6. windows phone 页面导航(6)

    原文:windows phone 页面导航(6) 页面导航的例子我们使用的是两个页面,从第一个页面(MainPage)导航到第二个页面(SecondPage),然后可以从第二个页面导航到第一个页面 , ...

  7. 【剑指offer】面试题26:复制的复杂链条

    def copyRandomList(self, head): if None == head: return None phead = head while phead: pnext = phead ...

  8. ORACLE 11G没有备份文件參数文件在异机通过rman备份恢复找回被误删的数据

    背景:          同事误删除线上数据.所以须要从备份中找回数据恢复. 真实屋漏偏逢连夜雨.船迟又遇打头风.前两天备份的磁盘坏块,如今仅仅有rman全备的.bak文件,没有控制文件和參数文件,所 ...

  9. 解决SMARTFORMS 中table 控件单行跨页的问题

    在CX项目中,MM模块做了大量的的单据打印的工作,一个问题困扰了我好久,一直不能解决.当物料描述很长时,table控件在单元格中能自动换行,这样就有可能在换页处出现一行记录的一部分打在上一页,一部分记 ...

  10. Objective-C代码块语法(block)使用

    和其它变量本质上相似的代码块.所不同的是,数据存储代码块是主体的函数. 使用的代码块被,你可以像打电话一样等标准功能,传入参数的数量,并获得返回值. 插入符号(^)语法标记块.我们熟悉的参数按照规约定 ...