DustJs - 访问不同的数据

时间:2015-07-22 22:13:49

标签: node.js express dust.js

我正在使用Dustjs并尝试以两种不同的方式编译,加载和呈现模板:基本上使用浏览器和节点(因此在客户端和服务器端)用于单个网页

我尝试过这样的事情:
index.js文件:

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!你好约翰!

有人可以向我解释我是否已经开始在尘埃中?

1 个答案:

答案 0 :(得分:1)

嵌入式模板正在由服务器处理 - 它无法判断模板是否在脚本标记内。

解决问题的真正方法是将JavaScript与模板分离,而不是将其嵌入内联。但是,如果必须这样做,则需要转义嵌入式模板。

{` Hello {firstName}! `}

这将导致服务器跳过呈现括号内的内容,以便客户端能够读取模板。

但是,你真的应该预先编译模板。