我正在使用Dustjs并尝试以两种不同的方式编译,加载和呈现模板:基本上使用浏览器和节点(因此在客户端和服务器端)用于单个网页
我尝试过这样的事情:var fs = require('fs');
var path = require('path');
var express = require('express');
var dust = require('dustjs-linkedin');
var app = express();
app.get('/', function(req, res) {
res.writeHead(200, {"Content-Type": "text/html"});
var src = fs.readFileSync(path.join(__dirname, 'hello.dust'), 'utf8'),
compiled = dust.compile(src, 'hello');
dust.loadSource(compiled);
dust.render('hello', { world: "earth" }, function(err, out) {
res.write(out);
});
res.end();
});
app.listen(80);
hello.dust文件:
[...]
Hello {world}!<br/>
<p id="output"></p>
<script type="text/javascript" src="js/dust-full.min.js"></script>
<script type="text/dust" id="test">Hello {firstName}!</script>
<script type="text/javascript">
(function(){
var src = document.getElementById('test').textContent,
compiled = dust.compile(src, 'test');
dust.loadSource(compiled);
dust.render('test', { firstName: "John" }, function(err, out) {
document.getElementById('output').textContent = out;
});
})();
</script>
[...]
但这就是我得到的:
Hello earth!你好!
我做了一些研究:模板“test”无法访问给定的'firstName',但仍然访问'world'。
我尝试设置'firstName'周围的上下文并通过{#test}访问,但它不起作用
我也尝试以这种方式编写数据(它也不起作用):
(function(){
var context = dust.context(null, {"test": { "firstName": "John" }});
}())
我想得到这个:
Hello earth!你好约翰!
有人可以向我解释我是否已经开始在尘埃中?
答案 0 :(得分:1)
嵌入式模板正在由服务器处理 - 它无法判断模板是否在脚本标记内。
解决问题的真正方法是将JavaScript与模板分离,而不是将其嵌入内联。但是,如果必须这样做,则需要转义嵌入式模板。
{` Hello {firstName}! `}
这将导致服务器跳过呈现括号内的内容,以便客户端能够读取模板。
但是,你真的应该预先编译模板。