gpt4 book ai didi

javascript - Handlebars block 表达式不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 15:40:23 25 4
gpt4 key购买 nike

昨天我决定学习 Handlebars,观看了一些教程等等。但我的代码遇到了一些奇怪的行为。

1)我有我的json数据:

{
"products": [
{
"name": "foo",
"price": 488.98,
"available": 3
},
{
"name": "bar",
"price": 520.89,
"available": false
}
]
}

2)我的index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Handlebars</title>
</head>
<body>

<div id="divToPopulate">
<!-- population w/ data -->
</div>

<script id="hdtemp" type="text/x-handlebars-template">
{{#each products}}

{{#toUpper name}}
{{/toUpper}}

{{#toStrong}}
<h4>{{price}}</h4>
{{/toStrong}}

{{#if available}}
<p>{{available}}</p>
{{else}}<p>Out of stock</p>
{{/if}}

{{/each}}
</script>

<!-- scripts -->
<script
src="https://code.jquery.com/jquery-3.2.1.min.js"
integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.8/handlebars.js"></script>
<script src="script.js"></script>
</body>
</html>

3)我的脚本:

$(document).ready(function(){

const inittemp = $('#hdtemp').html();
const template = Handlebars.compile(inittemp);

Handlebars.registerHelper("toUpper",(property)=>{
return new Handlebars.SafeString(`<h2>${property.toUpperCase()}</h2>`);
});

Handlebars.registerHelper("toStrong", (options)=>{
return new Handlebars.SafeString(`<p><strong>${options.fn(this)}</strong></p>`);
});

$.ajax("products.json").done((data)=>{
$('#divToPopulate').html(template(data));
console.log(data);
});
});

由于某种原因,当我渲染页面时,我的“toStrong”辅助 block 表达式不起作用。

{{#toStrong}}
<h4>{{price}}</h4>
{{/toStrong}}

之前的(“toUpper”)工作得很好,但是一旦我使用 options.fn(this) 而不是 {{price}} 我就得到黑色元素。使用 ctrl+shift+i,我在控制台中没有错误,其他一切似乎都工作正常。知道哪里出了问题吗?谢谢!

P.S:昨天我什至遇到了最奇怪的事情,并且再次使用 options.fn我有一个元素 h4 并使用 block expr。生成 {{place}} ,其中有我的本地主机的地址,例如: <h4>127.0.0.1:8080</h4>

最佳答案

你的toStrong助手几乎是正确的。困扰你的是 arrow function 的使用.

An arrow function does not create its own this context, so this has its original meaning from the enclosing context.

在 block 助手中使用箭头函数时,执行:option.fn(this) 不是您所期望的,this 不是当前的 Handlebars 上下文,在您的情况下它是 document 。所以你要做的就是将文档作为新的上下文传递。这就是为什么 block 助手内的 {{price}} 没有显示任何内容。但如果您执行 {{../price}} ,它会打印正确的值。

注册 Handlebars 助手时应避免使用箭头函数。除非您知道后果。

Handlebars.registerHelper("toUpper", function(property){
return new Handlebars.SafeString(`<h2>${property.toUpperCase()}</h2>`);

});

Handlebars.registerHelper("toStrong", function(options){
return new Handlebars.SafeString(`<p><strong>${options.fn(this)}</strong></p>`);
});

您还可以更改使用上层助手的方式,因为它不是 block 助手。

{{{toUpper name}}} <!-- see below -->

{{toUpper name}} <!-- html will be escaped in your case -->

而不是

{{#toUpper name}}{{/toUpper}}

三重存储

Handlebars HTML-escapes values returned by a {{expression}}. If you don't want Handlebars to escape a value, use the "triple-stash", {{{

var data = {
"products": [
{
"name": "foo",
"price": 488.98,
"available": 3
},
{
"name": "bar",
"price": 520.89,
"available": false
}
]
};

$(document).ready(function(){

const inittemp = $('#hdtemp').html();
const template = Handlebars.compile(inittemp);

Handlebars.registerHelper("toUpper",function(property){
return `<h2>${property.toUpperCase()}</h2>`;
});

Handlebars.registerHelper("toStrong", function(options){

return new Handlebars.SafeString(`<p><strong>${options.fn(this)}</strong></p>`);
});


console.log(template(data));

});
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Handlebars</title>
</head>
<body>

<div id="divToPopulate">
<!-- population w/ data -->
</div>

<script id="hdtemp" type="text/x-handlebars-template">
{{#each products}}

{{{toUpper name}}}

{{#toStrong}}
<h4>{{price}}</h4>
{{/toStrong}}

{{#if available}}
<p>{{available}}</p>
{{else}}<p>Out of stock</p>
{{/if}}

{{/each}}
</script>

<!-- scripts -->
<script
src="https://code.jquery.com/jquery-3.2.1.min.js"
integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.8/handlebars.js"></script>
<script src="script.js"></script>
</body>
</html>

关于javascript - Handlebars block 表达式不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43932566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com