多个空格键条件运算符

Posted

技术标签:

【中文标题】多个空格键条件运算符【英文标题】: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) 【参考方案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 吗?

以上是关于多个空格键条件运算符的主要内容,如果未能解决你的问题,请参考以下文章

三元条件下的多个 OR 运算符,

我可以在 [ngClass] 中使用条件(三元)运算符以及 Angular2 中的多个类条件吗?

多个布尔条件 - 运算符优先级

Angular ngClass 多个三元运算符条件

在 where 子句中使用多个条件时出现关系运算符错误

python_逻辑运算符