ejs利用javascript获得render传来的数据,并进行逻辑处理,报错undefined
发布于 2个月前 作者 Silenmile 471 次浏览 来自 问答

屏幕快照 2015-04-28 下午1.32.24.png 这个是我 news.ejs页面,报错function undefined 屏幕快照 2015-04-28 下午1.37.23.png news是我index.js从后台传过去的参量。 如果没有var之类的定义,可以显示信息。 但是加了var之类的js语句则报错。 想问一下,ejs页面怎么处理js逻辑,在javascript里如何使用<%=news.time%>可以获得的数据

13 回复

首先,不要在页面处理 js 逻辑 你这个问题可以慨括为如何传递 backend 模板数据到前端 js 方法有大概三种

  1. 用 <script> tag, js 全局变量
  2. ajax 再请求一次
  3. 如果用 angular 的话,可以用 ngInit

看看这两篇: http://flopalm.com/how-to-pass-backend-variable-value-to-angular-scope/ http://www.mircozeiss.com/how-to-pass-javascript-variables-from-a-server-to-angular/

https://github.com/mde/ejs/blob/master/lib/ejs.js#L463 可以看到

fn = new Function(exports.localsName + ', escape, include, rethrow', src);

以及

exports.localsName = _DEFAULT_LOCALS_NAME;

还有

  , _DEFAULT_LOCALS_NAME = 'locals'

也就是 可以用 locals 来获取你传入的data, 比如

render(tmpl, {  news:[] });

locals.news.forEach ...

@russj 您好,资料我看了,但我还是不太懂,ejs传过来的参数不就是到前端了吗?为什么js不可以用呢?js全局变量是怎么用呢?还有<script>标签和<% %>标签有什么区别么?<% %>不就是可以写js代码的吗?不好意思,新手,实在搞不明白!

@netwjx 这是什么意思,是吧render传过来的数据定义为locals的?,然后就可以直接在js里用了?

@Silenmile 我没有看过 ejs 的代码怎么实现这些的。我的理解是

1. ejs传过来的参数不就是到前端了吗?
ejs 穿的不是参数,不是变量,而是文本。因为你在前端看到的 html 是后端生成再发送到浏览器,所以你在 render 之后在后端改动了变量的话,变化是不会体现在前端的,就是你的 html 还是老样子,除非你是用的 meteor 有自动 subscribe 的功能,所以他们号称自己是 real-time。
2. 为什么js不可以用呢?
因为传过来的后端变量被嵌入到 html,所以 js 不能直接用。
3. js全局变量是怎么用呢?
<javascript>标签里都是全局变量,如果不是在函数中定义的话
4. 还有<script>标签和<% %>标签有什么区别么?
<script> 是 js 标签,<% %>标签是后端模板标签,会被后端生成的值(字符串)替代。
5.<% %>不就是可以写js代码的吗?
它是一个表达式,里面可以是 js 代码,但是最终生成字符串嵌入到 html 中,让前端渲染,所以用户可以看到动态的内容。

ejs传的参数压根就不是到前端。

ejs只是个模板引擎,不是干前后端通信的活的。

如果实在不懂哪里是前端哪里是后端,那就在页面上按下ctrl+u,然后对比你的ejs模板。

<% %>不是html标签, 是ejs运行内部逻辑的标记 生成的html页面里面是不应该有<% %>的

首先,分清本例中什么是前后端。ejs属于后端渲染模板,就当做jsp好吧。所有<% %>和<%= %>都会被数据渲染成html文本。前端js和后端不在一个上下文,分属两个运行环境,后端NodeJS,前端浏览器及各种客户端…

@russj 太感谢你了,谢谢你的帮助!

@DevinXian 那如果前端想利用ejs,render传过来的数据,根据数据确定div显示该如何做呢?

@Silenmile 就和你现在用的代码一样…把页面显示内容当做html文本(块)去输出就OK~模板其实就是个字符串替换的过程~我相信你问这个问题的时候,你已经知道怎么做了- -

@DevinXian 你好,我也有碰到类似的问题,前段时间想学习使用ejs,但是发现ejs中的Filters和Options方法怎么也没有办法在前端使用,看了你之前的回答,目前,我的理解如下:

ejs是后端模板,在前端能运行的只有类似于<% %>和<%= %>这样的标签, 而它的其它方法,都是让后台代码能够类似于jsp一样运行,也就是说Filters和Options方法其实都是在后端运行的。 我理解的对么,还请多多指教。谢谢。

问题其实很简单,其实是因为我的一个函数应用在了一个错误的类型上,所以报错函数未定义。并不是<% %>和前端js不能共用。事实上,ejs<% %>完全可以嵌套javascript代码,和在php,html里是一样的,那么怎么获得render传过来的数据?直接就可以获得。render传过来的数据,就属于前端的变量了,所以在<% %>里完全可以应用,没有区别。至于<%= %>,是可以直接输出变量值的,经过转义的。如果不想转义就用<%- %>,里面也是一个变量,但如果这个变量是个字符串,并且:

hello

是这样形式的,因为未被转义,所以在html显示新的一段hello.如果是<%= %>会显示:

hello

回到顶部