【问题标题】:Multiple Spacebar Conditional Operators多个空格键条件运算符
【发布时间】:2014-12-31 22:27:31
【问题描述】:

有没有办法缩短

{{#if arg1}}
    {{#if arg2}}
        //stuff
    {{/if}}
{{/if}}

只有一个 if?

{{#if arg1 arg2}}
{{#if arg1 && arg2}}

以上两种方法似乎都不起作用。

【问题讨论】:

  • 我发现我可以使用 UI.registerHelper(),但是我不确定如何配置它来接受任何数量的争论。 (数组好像不行,还没试过maps)

标签: meteor meteor-blaze spacebars


【解决方案1】:

空格键延续了 Mustache 和 Handlebars 是无逻辑模板语言的理念。这就是为什么即使是简单的逻辑也最好放在控制器而不是模板中。

但是,您可以使用 define a custom block helper 来执行逻辑 and

<template name="ifand">
  {{#if arg1}}
    {{#if arg2}}
      {{> Template.contentBlock}}
    {{else}}
      {{> Template.elseBlock}}
    {{/if}}
  {{else}}
    {{> Template.elseBlock}}
  {{/if}}
</template>

调用为:

{{#ifand arg1="foo" arg2="bar"}}
  // stuff
{{/ifand}}

你也可以学习more about passing variables into templates

对于一般情况(and 在任意数量的参数中),您需要注册一个全局模板助手:

Template.registerHelper('and', function () {
  var args = Array.prototype.slice.call(arguments, 0, -1);  // exclude key=value args
  var parameters = arguments[arguments.length - 1];  // key: value arguments

  return _.every(args, function (arg) {
    return !!arg;
  });

});

调用为:

{{#if and 1 "foo" 3 'bar' param="test"}}
  True
{{else}}
  False
{{/if}}

【讨论】:

  • 我知道如何将变量传递到模板中,我担心这种方法的是它无法处理 X 争论。我需要许多不同的模板来执行基本相同的任务。能够定义我自己的助手感觉是正确的路线,但我不明白将变量传递给助手是如何工作的,除非它存在只能处理单个变量的相同问题。
  • 不能在lib文件夹下成功定义Template吗?如果没有,放置全局模板帮助程序定义的最佳位置在哪里?
  • 我会把它们放在/client/libTemplate 应该在那里定义。
  • 这是个好主意。我会记下我的标准。感谢您的所有帮助,好先生。
【解决方案2】:

在模板中,您可以使用 this 对象来引用传入的参数,这样我就可以避免在大多数需要它们的情况下使用多个#if 参数。

Template.myTemplate.created = function() {
    if(this.data.arg1 && this.data.arg2) {
        //do JS setup here
    }
}

此外,可以使用指定助手

Template.registerHelper('exists', function() {
    if(this.data.arg1 && this.data.arg2) {
        return true
    }
}

然后你就这样执行了上面的助手

{{#if exists}}
    //stuff
{{/if}}

{{> myTemplate arg1 arg2}}

我只是偶然发现了这个,但这对我来说是一个巨大的发现。

【讨论】:

  • 我相信UI.registerHelper is, being deprecated。请检查我的更新答案。
  • 我尝试使用 Template.registerHelper,但它一直告诉我 Template 未定义。这很奇怪。如果是这种情况,我需要弄清楚为什么它对我不起作用并相应地更新它。
  • 已更新此内容以反映您的信息,因此我不会传播信息。不过,请参阅我对您的回答的评论,因为 UI 在 lib 定义期间存在,但 Template 不存在,我觉得 lib 是我应该定义全局帮助程序的地方。
  • 我试过了,但它对我不起作用。我什至没有看到 .this 上下文中的数据属性。我试过这个例如 {{> myTemplate "country" "label for country" "true" "another string with spaces" true}}。然后 Template.registerHelper('exists', function ([no parameters?]) { if (this.data.arg1) { return true } });没有this.data,我的arg1是什么?例如,我如何指代“国家”?我在调试中查看了当地人,没有“国家”。顺便说一句,感谢您的提示。我希望它能正常工作,因为我通常必须构建一个只是传递的虚拟助手
  • 我不知道什么 .data 没有暴露给您(我认为这就是为什么该函数调用中没有 args,因为您通过 .data 引用了 args)。你在用 Meteor 1.0X 吗?
猜你喜欢
  • 2017-08-25
  • 2017-12-01
  • 1970-01-01
  • 2012-09-14
  • 2013-01-14
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多