0

我正在尝试在过滤器中使用语言环境选项,但遇到问题,无法从过滤器访问该语言环境对象。

语言环境: json {"title": "HAMPI"}

筛选:

var jade = require(jade);
jade.filters.Posts = function(block) {
    return '{block:Posts}'+jade.render(block)+'{/block:Posts}';
};

输入:

body
    |#{title}
    :Posts
        div
            a
                #{title}

输出:

<body>
    HAMPI
    {block:Posts}<div><a><undefined></undefined></a></div>{/block:Posts}
</body>

我可以修复或处理此错误吗?

PS你可以查看这个存储库中的代码——我正在使用 grunt 和 grunt-contrib-jade 插件,但是要强制 grunt-contrib-jade 使用过滤器,你应该编辑 ./node_modules/grunt-contrib-jade/tasks/ Jade.js 以反映来自此拉取请求的更改

4

1 回答 1

1

过滤器在编译时应用,而可以访问局部变量的渲染是在运行时完成的。因此,过滤器无法访问您的局部变量。他们只看到原始文本。所以你可以这样做:

jade.filters.Posts = function(block) {
    return '{block:Posts}'+block+'{/block:Posts}'; //remove render
};

这样,您将推迟渲染,#{title}直到您拥有变量。它产生这个输出。

<body>HAMPI{block:Posts}HAMPI{/block:Posts}</body>

我如何测试它:

var jade = require(jade);
fn = function(block) {
    return '{block:Posts}'+jade.render(block)+'{/block:Posts}';
};
var fn = jade.compile(fs.readFileSync(__dirname + '/file2.jade'));
console.log(fn({"title": "HAMPI"}));

这里提到了同样的问题:在 node.js 中,如何将变量传递给 :stylus 过滤器?

作为参考,您可以查看以下链接:

[更新]

如果您想使用渲染,那么为什么不使用它传递本地变量。所以如果你这样做:

jade.filters.Posts = function(block) {
    return '{block:Posts}'+jade.render(block,{"title": "HAMPI"})+'{/block:Posts}'
};

它给出了这个:

<body>HAMPI{block:Posts}<div><a><HAMPI></HAMPI></a></div>{/block:Posts}</body>

缺点是您的本地视图无法使用,您必须直接传递它。

于 2013-09-18T05:45:22.427 回答