【问题标题】:Why does trimmed string in handlebars template not render?为什么车把模板中的修剪字符串不呈现?
【发布时间】:2021-07-28 16:50:16
【问题描述】:

谁能解释为什么在以下示例中typeof result 返回string 时,result 在控制台中打印为[object Object]

我从车把文档的最底部举了这个例子: https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access

我认为这可能与车把不允许访问 aString 原型的 toString 方法这一事实有关,但如果文档正确,这应该可以工作。

var template = Handlebars.compile(document.getElementById('template').innerHTML);

var result = template({ aString: "  abc  " }, {
    allowedProtoMethods: {
      trim: true
    }
  });

console.log(result, typeof result);

document.getElementById('output').innerHTML = result;
<script src="https://unpkg.com/handlebars@latest/dist/handlebars.js"></script>

<div id="output"></div>
<script type="template/handlebars" id="template">{{aString.trim}}</script>

【问题讨论】:

  • 可能是因为result 字面意思是"[object Object]"aString.trim 是一个函数 object.
  • 看起来您只是按照文档中的示例进行操作? handlebarsjs.com/api-reference/…
  • 你还调用了两次模板。
  • 糟糕,我的错。它应该只被调用一次,但问题是一样的。 @FelixKling,是的,该示例直接来自文档。
  • @FelixKling typeof 运算符返回 string。如果它是一个函数对象,我希望它返回function。你可以试试typeof function(){}。我认为 trim 函数实际上应该由车把调用

标签: javascript handlebars.js


【解决方案1】:

这本质上是一个典型的“丢失this”问题。当车把评估aString.trim 时,它会返回对String.prototype.trim 的引用。此时与aString 的“连接”丢失,trim 不知道要对哪个值进行操作。

这可以通过使用自定义对象 + 方法复制来演示:

var template = Handlebars.compile(document.getElementById('template').innerHTML);

var result = template({
  foo: { 
    data: "data",
    getData() { return this.data || 'not found'},
    staticData() { return 'static data'; }
  },
});

document.getElementById('output').innerHTML = result;
<script src="https://unpkg.com/handlebars@latest/dist/handlebars.js"></script>

<div id="output"></div>
<script type="template/handlebars" id="template">{{foo.getData}} {{foo.staticData}}</script>

看看它如何呈现not found 而不是data?那是因为this 指的是foo 中的对象,它指的是别的东西(可能是全局对象)。

换句话说,您似乎无法以这种方式调用依赖于this 的方法。

您可以改用helper

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
  • 2023-02-04
  • 1970-01-01
  • 2016-06-19
  • 2020-01-16
  • 1970-01-01
相关资源
最近更新 更多