如何覆盖 Handlebars 的 `if` 助手

Posted

技术标签:

【中文标题】如何覆盖 Handlebars 的 `if` 助手【英文标题】:How to override Handlebars' `if` helper 【发布时间】:2019-02-05 00:16:14 【问题描述】:

我正在寻找一种方法来改变 Handlebars 的 if 助手的工作方式。

Mandrill 已将a few modifications 制成标准把手。这些方便的更改之一是它们处理 Handlebars 的 if 块助手的方式。他们在 if 帮助器中添加了评估表达式的功能,如下所示:#if `purchases > 3`

我需要能够在本地编译 Mandrill 模板,以进行测试和预览,而此功能使其变得困难。我知道我可以编写自己的自定义助手,但在这种情况下,我正在寻找一种方法来改变内置 if 助手的工作方式。

我想我可以构建自己的 Handlebars 版本。 还有其他建议吗?

【问题讨论】:

【参考方案1】:

我认为只要您的标准助手工作正常,重新定义标准助手就没有问题。您将在下面的 sn-p 中找到一个示例,该示例覆盖了 if 助手以代替文本。因此,只需注册您自己的助手,这将覆盖默认助手。如果您希望 else 也可以工作,则必须在 if 帮助代码中处理它。

 
$(document).ready(function () 
  var context = 
    "textexample1" : "hello",
  ;
  Handlebars.registerHelper('if', function(text) 
    return new Handlebars.SafeString(text);
  );
	var source   = $("#sourceTemplate").html();
  var template = Handlebars.compile(source);
  var html    = template(context);
  $("#resultPlaceholder").html(html);
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.0.5/handlebars.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script id="sourceTemplate" type="text/x-handlebars-template">
#if 'test override'
   textexample1
/if
</script>
<br/>
<div id="resultPlaceholder">
</div>

【讨论】:

以上是关于如何覆盖 Handlebars 的 `if` 助手的主要内容,如果未能解决你的问题,请参考以下文章

Handlebars的奇数和偶数比较助手[关闭]

Ember.js - 使用 Handlebars 助手检测子视图是不是已呈现

全局助手正在覆盖流星车把模板中的本地上下文

将 someVar+'a string' 传递给 Handlebars.js 助手?

使用 each 和 handlebars 助手对对象键进行排序

如何在浏览器中使用带有普通手柄的手柄助手?