我们也有一个系统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. 利用Nginx构建负载均衡server

    大家都知道.一个域名相应一个IP地址,而一个WebSite则相应一个IP地址上相应port服务的应用程序(或位置).而大型站点的并发訪问量很大,这些站点是怎样在一台Webserver上实现负载均衡的呢 ...

  2. 《Android内核剖析》读书笔记 第13章 View工作原理【View重绘过程】

    计算视图大小的过程(Measure) 视图大小,准确的来说应该是指视图的布局大小:我们在layout.xml中为每个UI控件设置的layout_width/layout_height两个属性被用来设置 ...

  3. ocx控件手动修改clsid的方法

    替换掉工程的两个地方:IDL文件和CTRL文件. IMPLEMENT_OLECREATE_EX(CMultiwndCtrl, "MULTIWND.MultiwndCtrl.1", ...

  4. 详解CMS垃圾回收机制

    原创不易,未经允许,不得转载~~~ 什么是CMS? Concurrent Mark Sweep. 看名字就知道,CMS是一款并发.使用标记-清除算法的gc. CMS是针对老年代进行回收的GC. CMS ...

  5. mysql 利用触发器(Trigger)让代码更简单

    一,什么触发器 1,个人理解 触发器,从字面来理解,一触即发的一个器,简称触发器(哈哈,个人理解),举个例子吧,好比天黑了,你开灯了,你看到东西了.你放炮仗,点燃了,一会就炸了. 2,官方定义 触发器 ...

  6. Webservice-初级实例(二)

    去年这个时候在亿阳工作,经理让我做数据同步功能,用到WS,于是草草研究之后,就投入使用了.前两天同事给我讲解分配给我的项目时,讲到其中一块是数据同步功能,我不禁一笑,同事问笑什么,我说世界真是奇妙,去 ...

  7. 内网port映射具体解释(花生壳)

    关于怎样建立服务器的解答. 一.花生壳的作用 首先,我们先来了解一下花生壳的究竟有什么作用.由于ADSL每次拨号上网所获得的IP地址每次都是不同的,花生壳起到的作用就是方便用户訪问我们的server( ...

  8. 使用oracle数据库,多用户同时对一个表进行增加,删除,修改,查看等操作,会不会有影响?

    使用oracle数据库,多用户同时对一个表进行增加,删除,修改,查看等操作,会不会有影响? 1.问题:各操作间或者性能上会不会有影响? 如果有该如何解决? 多用户操作的影响主要是回锁定记录,oracl ...

  9. C语言cgi(1)

    1Columbia Universitycs3157 – Advanced ProgrammingSummer 2014, Lab #2, 60ish pointsJune 9, 2014Follow ...

  10. Hadoop-2.2.0中国文献——MapReduce 下一代 —配置单节点集群

    Mapreduce 包 你需从公布页面获得MapReduce tar包.若不能.你要将源代码打成tar包. $ mvn clean install -DskipTests $ cd hadoop-ma ...