javascript – 无法在客户端上呈现EJS模板
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 无法在客户端上呈现EJS模板,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3702字,纯文字阅读大概需要6分钟。
内容图文
![javascript – 无法在客户端上呈现EJS模板](/upload/InfoBanner/zyjiaocheng/781/bf833f97f76846aca2f69e6cca81d0de.jpg)
我在express上编写应用程序,我使用ejs作为视图/模板引擎.
在路径/艺术家,我正在渲染艺术家所涵盖的视图artists.ejs.当点击封面时,我想要一个AJAX调用来检索相应的数据,将它放在我的模板/视图中,用于艺术家artist.ejs,并在封面下的HTML中显示该模板.
我已经看到了this相关的问题,但它还没有解决我的用例.
一切似乎都很清楚,但我无法使用模板渲染数据.我想编译模板服务器端,将其发送到准备使用的客户端,然后在需要时使用从AJAX调用接收的数据填写它.
我做了什么:
调用/ artists时,使用ejs.compile(str,opt)在服务器端编译:
router.get('/artists', function(req, res) {
// Compile artist template
fs.readFile('views/artist.ejs', "utf-8", function(err, template) { // Convert template file to string
artist_template = ejs.compile(template); // Compile template
res.render('artists.ejs', {template: artist_template}); // render page with compiled template
});
我负责将文件转换为String,因为ejs编译器只能使用String(与Jade .compileFile相比)
然后在客户端,我抓住了这个功能:
<script>
var template = <%= template %>
</script>
然后在另一个脚本上,我使用AJAX调用检索数据:
$.get('/artists/'+artist_name, function(data) {
var html = template({artist: data});
$('#artist-page').html(html);
}
但是当我打电话时,我会收到:
Uncaught ReferenceError: fn is not defined
当我调用模板时,fn,我收到:
Uncaught ReferenceError: opts is not defined.
函数fn是硬编码的吗?我已经阅读了EJS和Jade文档,但关于我的问题几乎没有相关信息.
我是否也需要客户端的模板?
解决方法:
我最终找到了一个问题的解决方法,我理解你的答案,你可以用两种不同的方式进行:
1)我做了什么:读取并将模板保存为字符串,然后使用ejs Runtime脚本将其呈现在客户端.
// In controller.js
var templates = {};
templates.template1 = fs.readFileSync(filePath1, 'utf-8'); // Read template as a string
templates.template2 = fs.readFileSync(filePath2, 'utf-8');
...
res.render('app.ejs', {templates: templates}); // Send templates in view
// In view app.ejs
<script type="text/javascript">
var templates = <%- JSON.stringify(templates) %>; // Get templates object (object of strings)
</script>
<script type="text/javascript" src="/JS/ejs.min.js"></script> <!-- Load ejs RunTime -->
// In site.js - javascript client/public file
$.get('/artists', function(data) {
var html = ejs.render(templates.template1, data); // Render ejs client side with EJS script (template1 corresponds to the artists template)
$('#artists-wrapper').html(html); // Sets HTML
});
因此,我在第一页加载时发送所有模板,然后在客户端呈现请求的页面.根据我的阅读,兴趣是你只通过AJAX调用发送JSON对象(你的数据),而不是整个页面,使你的请求变得轻松.所有模板只有第一次加载很重.
2)根据@RyanZim的回答:将模板服务器端编译成函数,发送它们,然后在客户端调用它们:template(data).如果我理解得很好,在这种情况下不需要EJS客户端库,我的模板不再是字符串而是函数:
// In controller.js
var templates = {};
templates.template1 = ejs.compile(fs.readFileSync(filePath1, 'utf-8'), {client: true}); // Get template as a function
templates.template2 = ejs.compile(fs.readFileSync(filePath2, 'utf-8'), {client: true});
...
res.render('app.ejs', {templates: templates}); // Send templates in view
但是,在我看来,我无法得到它们:
<script type="text/javascript">
var templates = <%- JSON.stringify(templates) %>; // Get templates object (object of functions)
</script>
不管用.它们是我发送之前在服务器上的功能,但我不知道如何恢复它们.你有好主意吗 ?
我尝试了一种解决方法,在发送之前将它们更改为String:
templates.template1 = templates.template1.toString();
发送它们然后发送客户端,将它们转换回函数:
var template = new Function(templates.template1);
$.get('/artists', function(data) {
var html = template(data);
$('#artists-wrapper').html(html); // Sets HTML
});
但这也行不通.
你知道我在这里缺少什么吗?
最后,你是否同意在使用函数之前编译服务器端在计算方面比渲染每个模板客户端更好?
感谢您的帮助,希望能帮助其他人!
内容总结
以上是互联网集市为您收集整理的javascript – 无法在客户端上呈现EJS模板全部内容,希望文章能够帮你解决javascript – 无法在客户端上呈现EJS模板所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。