我正在构建一个新的 Meteor 应用程序,但我不知道如何使用 Handlebars 添加 JavaScript 逻辑以console.log()
在我的每个循环之前运行。在主干中,我只是<% console.log(data); %>
测试数据是否被传入。
我不确定如何使用 Meteor 和 Handlebars 执行此操作,而且我在他们的网站上找不到解决方案。
5 回答
在项目中客户端加载的 JavaScript 文件之一中创建 Handlebars 帮助器:
Template.registerHelper("log", function(something) {
console.log(something);
});
然后在您的模板中调用它:
{{log someVariable}}
您可以简单地记录当前上下文{{log this}}
。
(请注意,在 0.8 版之前的 Meteor 中,或在 Meteor 应用程序之外的纯 Handlebars 中,替换Template.registerHelper
为Handlebars.registerHelper
.)
Handlebars v3现在有一个内置的日志助手。您可以从模板内登录到控制台
{{log this}}
您可以像这样设置日志记录级别
Handlebars.logger.level = 0; // for DEBUG
我发现这个助手非常有用
Handlebars.registerHelper("debug", function(optionalValue) {
console.log("Current Context");
console.log("====================");
console.log(this);
if (optionalValue) {
console.log("Value");
console.log("====================");
console.log(optionalValue);
}
});
那么你可以通过两种方式使用它
只是一个简单的
{{debug}}
这将打印出当前上下文
或检查单个值
{{debug val}}
打印出那个值
我这样做,
Handlebars.registerHelper('log', function(content) {
console.log(content.fn(this));
return '';
});
它允许我使用我坐在里面的模板系统编写一个调试器块。所以我可以给它一个块,它会解析内容,但只需将其发送到 console.log。
{{#log}} title is {{title}} {{/log}}
我也这样做
$('script[type="text/x-handlebars-template"]').each(function(){
Handlebars.registerPartial(this.id,$(this).html());
});
这使我的所有模板都可以作为部分模板使用,允许我将模板干燥成可重用的功能块,而无需编辑模板本身以外的任何内容。
所以我现在可以做类似的事情
{{#log}}Attribute listing {{>Attributes}}{{log}}
和
<script id="Attributes" type="text/x-handlebars-template">
{{#each attributes}}
{{@key}}={{this}}
{{/each}}
</script>
我总是使用以下助手:它记录数据并添加一个可选的断点。这样您就可以在浏览器调试器中检查当前的 Handlebars 上下文;-)
在https://gist.github.com/elgervb/5c38c8d70870f92ef6338a291edf88e9上找到
/**
* Register a debug helper for Handlebars to be able to log data or inspect data in the browser console
*
* Usage:
* {{debug someObj.data}} => logs someObj.data to the console
* {{debug someObj.data true}} => logs someObj.data to the console and stops at a debugger point
*
* Source: https://gist.github.com/elgervb/5c38c8d70870f92ef6338a291edf88e9
*
* @param {any} the data to log to console
* @param {boolean} whether or not to set a breakpoint to inspect current state in debugger
*/
Handlebars.registerHelper( 'debug', function( data, breakpoint ) {
console.log(data);
if (breakpoint === true) {
debugger;
}
return '';
});