集成ejs和angular
我们也有一个系统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的更多相关文章
- 手把手教你用ngrx管理Angular状态
本文将与你一起探讨如何用不可变数据储存的方式进行Angular应用的状态管理 :ngrx/store——Angular的响应式Redux.本文将会完成一个小型简单的Angular应用,最终代码可以在这 ...
- ApacheCN Angular 译文集 20211114 更新
Angular 专家级编程 零.前言 一.架构概述和在 Angular 中构建简单应用 二.将 AngularJS 应用迁移到 Angular 应用 三.使用 Angular CLI 生成具有最佳实践 ...
- Angular核心概念
一.集成开发环境@angular/cli IE8之后才有debugger工具 2009,nodejs发布,前端Big Bang 1.1 基于NodeJS的工具链 打包工具 grunt 对js代码做合并 ...
- (转)构建自己的AngularJS,第一部分:Scope和Digest
原翻译链接:https://github.com/xufei/Make-Your-Own-AngularJS/edit/master/01.md 原文链接:http://teropa.info/blo ...
- Angularjs 脏值检测
文章转自:http://www.ituring.com.cn/article/39865 构建自己的AngularJS,第一部分:Scope和Digest 原文链接:http://teropa.inf ...
- DevExpress v18.2新版亮点——DevExtreme篇(四)
行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍新版本新功能.本文将介绍了DevExtreme Complete Sub ...
- AngularJS的Scope和Digest
Angular是一个成熟和强大的JavaScript框架.它也是一个比较庞大的框架,在熟练掌握之前,需要领会它提出的很多新概念.很多Web开发人员涌向Angular,有不少人面临同样的障碍.Diges ...
- MEAN 26
MEAN 纸质书,第26章内容,使用社交媒体账户作为身份验证来源 先不看. 功能:登录,注册 或者 用户,身份认证和会话管理 功能描述:用户注册,登录,查看,编辑信息,logout. 1.expres ...
- popup定位引擎popper.js介绍
https://medium.com/@FezVrasta/popper-js-v1-5e8b3acd888c https://survivejs.com/blog/popper-interview/ ...
随机推荐
- 新版SDK自己主动加入PlaceholderFragment的思考
自从Android SDK更新到22.6.3,发现新建Activity的时候,会自己主动生成一个Fragment.这个Fragment是activity的静态内部类.同一时候生成了一个xml叫frag ...
- 【JS】依据表格ID进行排序(附凝视)
分享一个前端做的依据表格ID进行排序的方法哈,贴码例如以下: HTML: <input type="button" id="btn1" value=&qu ...
- There is no Action mapped for namespace / and action name UserAction
果断收藏了,说的非常具体.刚開始学习的人常常遇到的问题. There is no Action mapped for namespace / and action name UserAction 在网 ...
- CF 460C Present 【DP+】主意
给你n高树花.m日,每天连续浇筑w鲜花.一天一次,花长1高度单位 求m天后.最矮的花最高是多少 最大最小问题能够用二分来解 首先我们能够得到全部花的最矮高度即答案的下界,给这个花浇m天即是答案的上界 ...
- 远程centos改动yum源
yum -y install unzip发现运行不了,说是找不到unzip的包,搜索发现时由于yum源的问题,那我就改动yum吧, 在网上找到的方法是这么说的: 1. cd /etc/yum.repo ...
- mysql sqlserver Oracle字符串连接
mysql 例mysql> select CONCAT('My', 'S', 'QL'); sqlserver select name+'aa' from student; oracle sel ...
- 开源企业IM-免费企业即时通讯-ENTBOOST V2014.183 Windows版本号正式宣布
ENTBOOST,VERSION 2014.183 Windows(点击下载)版本号公布.主要添加PC端P2P(点对点)文件传输功能:公布安卓Android手机clientAPP 1.0版本号.公布苹 ...
- html网页特殊符号代码
HTML特殊字符编码大全:往网页中输入特殊字符,需在html代码中加入以&开头的字母组合或以&#开头的数字.下面就是以字母或数字表示的特殊符号大全. ...
- 无法打开登录所请求的数据库 "ASPState"。登录失败。 用户 'NT AUTHORITY/SYSTEM' 登录失败。
原文:无法打开登录所请求的数据库 "ASPState".登录失败. 用户 'NT AUTHORITY/SYSTEM' 登录失败. 无法打开登录 'ASPState' 中请求的数据库 ...
- eclipse 代码清理 代码格式化 代码凝视
Code Style包含两个方面:代码清理,代码规范化.代码清理能够參考: http://www.ibm.com/developerworks/cn/opensource/os-eclipse-cle ...