Javascript 把手中模板的条件呈现

Javascript 把手中模板的条件呈现,javascript,handlebars.js,templating,Javascript,Handlebars.js,Templating,在Handlebar中,如果未提供上下文数据,则默认情况下不渲染任何内容: e、 g.title:{{title}如果上下文中没有提供title变量,则将呈现title: 我想构建一个助手,在提供上下文时正确地计算模板,但在没有提供上下文变量时显示实际的mustache模板 我可以使用以下代码有条件地显示渲染或模板: {{#unless title}} {{{{raw-helper}}}} <h2>title: {{title}}</h2> {{{{/raw

在Handlebar中,如果未提供上下文数据,则默认情况下不渲染任何内容:

e、 g.
title:{{title}
如果上下文中没有提供
title
变量,则将呈现
title:

我想构建一个助手,在提供上下文时正确地计算模板,但在没有提供上下文变量时显示实际的mustache模板

我可以使用以下代码有条件地显示渲染或模板:

{{#unless title}}
  {{{{raw-helper}}}}
  <h2>title: {{title}}</h2>
  {{{{/raw-helper}}}}
{{else}}
  <h2>title: {{title}}</h2>
{{/unless}}
如果
body
字符串不是空的/空的/未定义的,它将呈现:

body: 'this is the body provided in context'
body: {{body}}
如果未提供主体,则将呈现:

body: 'this is the body provided in context'
body: {{body}}
到目前为止,我尝试按如下方式注册帮助者:

Handlebars.registerHelper('raw-unless', function(data, options) {
if(data) {
return options.fn(this);
}
else {
  var out = '{{#raw-helper}}';// 
  out += options.fn();
  out += '{{/raw-helper}}';// 
return out;
}
});
但是它呈现:
{{{raw helper}}体:{{/raw helper}}



我不太熟悉自定义助手创建,任何帮助都会受到欢迎

,因为您没有在上下文中发送
正文
,它是拒绝的

{{#raw-unless body}}
    body: {{body}}
{{/raw-unless}}
因此,在
else
条件中,返回要显示的文本。在这种情况下

Handlebars.registerHelper('raw-unless', function(data, options) {
  if (data) {
    return options.fn(this);
  } else {
    return '{{body}}'
  }
});

我认为您无法从块助手中获取预编译的模板源代码。因此,我为您看到了两个选项:将默认值直接传递给您的助手,或者将字符串键传递给您的助手,以便助手可以格式化默认值

第一个选项更通用,因为它允许模板定义默认输出:

Handlebars.registerHelper('render1', function (value, defaultValue) {
    return value || defaultValue;
});
您可以通过以下方式在模板中使用它:

body: {{render1 body '{{body}}'}}
如果您不需要在模板中方便地定义默认文本,那么第二个选项很有吸引力,因为它很简洁:

Handlebars.registerHelper('render2', function (key) {
    return this[key] || '{{' + key + '}}';
});
它将在模板中用作:

body: {{render2 'body'}}
供你参考,我有


按OP编辑

为了处理助手的不正确使用,我对其进行了如下调整:

{{#raw-unless body}}
    body: {{body}}
{{/raw-unless}}
Handlebars.registerHelper('render1', function (value, defaultValue) {
  var v = (typeof value ==='string')?value:null;
  var d = (typeof defaultValue === 'string')?defaultValue:'ERROR: undefined model / no default value provided';
  return v || d;
});
它将处理助手的误用,如:

body: {{render1 body}}
当上下文中未提供
正文
且未提供默认值时,或者:

body: {{render1}}

当模型未定义时

谢谢,但我不希望模板代码出现在助手代码中(关注点分离)。我原以为有一种方法可以从helper函数访问块helper的内容,但它似乎不是handlebar的工作方式:请看,似乎在模板中使用条件,以及{{{{{raw helper}}}}}},正如我最初所做的那样,是goThanks的方法!我喜欢选项一,因为默认输出是在模板中定义的;使用这样一个简单的助手肯定比使用{{{{{raw helper}}}这样的语法更优雅、更枯燥