集成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/ ...
随机推荐
- 经典回忆Effective C++ 1
c++ 联邦语言: typedef { unit C; unit Object-Oriented C++; unit Template C++; unit STL; }; notice: C++高效编 ...
- iOS开发人员必看的精品资料(100个)
目录下载地址:http://down.51cto.com/data/416672 附件预览如下: iOS游戏开发之Unity3D引擎系列 http://down.51cto.com/zt/399 iP ...
- 用C++语言开发Android程序 配置开发环境
转自:http://www.cnblogs.com/yaotong/p/3622430.html 用C++语言开发Android程序 配置开发环境 如果你是一个C++语言的死忠,你喜欢C++语言到 ...
- include设置属性在relativelayout布局中无效
转自:http://4265337.blog.163.com/blog/static/195375820127935731114/ 再来说一个在使用这两个标签时最容易出现的问题. 经常会有同学在Rel ...
- 深入浅出KnockoutJS
深入浅出KnockoutJS 写在前面,本文资料大多来源网上,属于自己的学习笔记整理. 其中主要内容来自learn.knockoutjs.com,源码解析部分资料来自司徒正美博文<knockou ...
- 详细分析Java中断机制(转)
1. 引言 当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时……都需要通过一个线程去取消另一个线程正在执行的任务.Java没有提供一种安全直接的方法 ...
- Holding Bin-Laden Captive!(杭电1085)(母函数)
Holding Bin-Laden Captive! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- SplitContainer如何实现左侧导航,正确显示和导航内容
关于这种类型的设计有很多的实现,这样,我首先解释一下我使用: 我的原则是实现方式,将form嵌panel在,作为一个子窗口. 如下面的代码细节: Form form = new DataSelect( ...
- MFC漆摘要-截图,获得DIB/DDB图形Pixel
1. 当前Screen进行Copy屏幕,获得BITMAP 当前屏幕Copy.须要获取当前屏幕的HDC, 一种是直接从屏幕DC抓原始图. 一种是然后使用兼容MemDC进行抓图,然后能够附加图 ...
- C# 通过豆瓣网络编程API获取图书信息
这篇文章主要是关于如何通过豆瓣API获取信息的书籍,起初,我看到了原来的想法的内容是"C# 网络编程之网页简单下载实现"中通过HttpWebResponse类下载源代码,再通过正則 ...