服务器怎么修改ejs的值,ejs的模版嵌套(服务器端vs浏览器端)

转自:http://www.zhixing123.cn/jsp/33163.html

EJS(Embeded

Javascript),是类似JSP,eRuby之类的,将代码嵌入到HTML页面中,并动态执行的一种机制。

在说EJS之前,我们要区分两个EJS,一个是基于nodeJS平台运行的EJS,另外一个是在浏览器执行的EJS。当然,基于NodeJS的EJS也提供了client方式运行,但是用了一下,很别扭。

1. NodeJS平台上的EJS

NodeJS平台中的EJS,其原理是与JSP,eRuby相同的:包含代码的HTML页面在服务器端被编译并执行得到最终的HTML,然后返回给客户端显示。

这种方式,对服务器的性能(计算、IO)要求相对比较高,因为所有的页面转换都是在服务器端执行的,客户端只负责展现。

NodeJS平台中的EJS,提供了模版包含(include)的功能,类似PHP页面,可以include不同的页面部件,组合在一起。其语法为:

%>。这个功能对于模块化编程和代码共享非常有用。

2. 浏览器端的EJS

这里说的EJS是后一种,在浏览器中执行的EJS。

浏览器中执行的EJS,其原理与服务器端的EJS有些差异:浏览器端的EJS,其JS代码,是在客户端(浏览器中)完成执行并转成HTML的。这种方式,一定程度上可以减轻服务器的负载。对于我这种没有服务器资源的人来说,就比较偏好这种方式。

但是这种EJS库,不支持 include 功能。这个曾让我苦恼了一阵子,不过前两天,我发现了一个方法,可以等价

include:

1)用jquery。

2)定义一个框架的EJS页面。

我的HTML页面:

id=”contentContainer”>

我的框架EJS页面:

product.ejs

separately–>

< /div>

3)将框架EJS页面中会复用的元素抽取为单独的EJS页面。

images

for ( var i = 0; i < images.length; i++){

%>

src=””/>

%>

4)使用jquery将这些ejs页面组合起来。

var html = new EJS({url :

“/product/product.ejs”}).render(data);

$(“#contentContainer”).append(html);

var html = new EJS({url :

“/product/product_image.ejs”}).render(data);

$(“#contentContainer #images”).append(html);

问题:

1. ejs模版引擎中使用layout.ejs后无法生效的解决方法

解决:安装express-partials

然后设置:

var partials = require('express-partials');

app.set('view engine', 'ejs');

app.use(partials());

这样之后,view目录下找不到layout.ejs,自己实现layout.ejs就可以了

2.

express3删除了试图助手注册函数:helplers(静态)和dynamicHelpers(动态),分别改用locals和中间件方法use来代替,如何使用:

2.x:

app.helpers({config:config,title:config.title});app.dynamicHelpers({//防止csrf攻击csrf:function(req,res){returnreq.session?req.session._csrf:'';},req:function(req,res){returnreq;},userInfo:function(req,res){returnreq.session.user;}});

3.x:

//app.helpers()app.locals({config:config,title:config.title});//app.dynamicHelpersapp.use(function(req,res,next){res.locals.title=config['title']res.locals.csrf=req.session?req.session._csrf:'';res.locals.req=req;res.locals.session=req.session;next();});

app.use(app.router);

在模版里面引用通过locals和use设置的全局变量时,通过locals.XXX的方式来引用

注意:router里值无法传递给res.locals.xxx,因为因为先执行的lcoals后执行route

所以无法再传递值res.locals.xxx

,要想获得router里的值,请将app.use(app.router)放在中间件之后执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值