这个是我 news.ejs页面,报错function undefined news是我index.js从后台传过去的参量。 如果没有var之类的定义,可以显示信息。 但是加了var之类的js语句则报错。 想问一下,ejs页面怎么处理js逻辑,在javascript里如何使用<%=news.time%>可以获得的数据
首先,不要在页面处理 js 逻辑 你这个问题可以慨括为如何传递 backend 模板数据到前端 js 方法有大概三种
- 用 <script> tag, js 全局变量
- ajax 再请求一次
- 如果用 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代码的吗?不好意思,新手,实在搞不明白!
@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属于后端渲染模板,就当做jsp好吧。所有<% %>和<%= %>都会被数据渲染成html文本。前端js和后端不在一个上下文,分属两个运行环境,后端NodeJS,前端浏览器及各种客户端…
@DevinXian 你好,我也有碰到类似的问题,前段时间想学习使用ejs,但是发现ejs中的Filters和Options方法怎么也没有办法在前端使用,看了你之前的回答,目前,我的理解如下:
ejs是后端模板,在前端能运行的只有类似于<% %>和<%= %>这样的标签, 而它的其它方法,都是让后台代码能够类似于jsp一样运行,也就是说Filters和Options方法其实都是在后端运行的。 我理解的对么,还请多多指教。谢谢。
问题其实很简单,其实是因为我的一个函数应用在了一个错误的类型上,所以报错函数未定义。并不是<% %>和前端js不能共用。事实上,ejs<% %>完全可以嵌套javascript代码,和在php,html里是一样的,那么怎么获得render传过来的数据?直接就可以获得。render传过来的数据,就属于前端的变量了,所以在<% %>里完全可以应用,没有区别。至于<%= %>,是可以直接输出变量值的,经过转义的。如果不想转义就用<%- %>,里面也是一个变量,但如果这个变量是个字符串,并且:
hello
是这样形式的,因为未被转义,所以在html显示新的一段hello.如果是<%= %>会显示:hello