String Handlebarsjs检查字符串是否等于值

String Handlebarsjs检查字符串是否等于值,string,handlebars.js,logical-operators,String,Handlebars.js,Logical Operators,在把手中,是否可以在不注册辅助对象的情况下检查字符串是否等于另一个值?在车把参考资料中,我似乎找不到任何与此相关的信息 例如: {{#if sampleString == "This is a string"}} ...do something {{/if}} context.eq = function(param1, param2) { return param1 === param2; } context.notEq = function(para

在把手中,是否可以在不注册辅助对象的情况下检查字符串是否等于另一个值?在车把参考资料中,我似乎找不到任何与此相关的信息

例如:

{{#if sampleString == "This is a string"}}
...do something
{{/if}}
    context.eq = function(param1, param2) {
        return param1 === param2;
    }

    context.notEq = function(param1, param2) {
        return param1 !== param2;
    }
看来你不能“直接”去做

尝试使用助手,为什么不呢

在javascript代码中注册帮助程序:

Handlebars.registerHelper('ifEquals', function(arg1, arg2, options) {
    return (arg1 == arg2) ? options.fn(this) : options.inverse(this);
});
在模板中使用:

{{#ifEquals sampleString "This is a string"}}
    Your HTML here
{{/ifEquals}}
{{#if isSampleString}}
    Your HTML here
{{/if}}
详情如下:

更新: 另一种方式:

假设您的数据是:

var data = {
    sampleString: 'This is a string'
};
然后(使用jQuery):

使用模板:

{{#ifEquals sampleString "This is a string"}}
    Your HTML here
{{/ifEquals}}
{{#if isSampleString}}
    Your HTML here
{{/if}}

刚从谷歌搜索到这篇关于如何检查一个字符串是否等于另一个字符串的文章

我在NodeJS服务器端使用HandlebarsJS,但在前端也使用相同的模板文件,使用浏览器版本的HandlebarsJS对其进行解析。这意味着,如果我想要一个自定义的助手,我必须在两个不同的地方定义它,或者为有问题的对象分配一个函数-太费劲了

人们忘记的是,某些对象具有可在胡子模板中使用的继承函数。对于字符串:

包含整个匹配结果和捕获的匹配结果的任何括号的数组;如果没有匹配项,则为null

我们可以使用此方法返回匹配数组,如果未找到匹配项,则返回
null
。这是完美的,因为查看HandlebarsJS文档

可以使用if辅助对象有条件地渲染块。如果其参数返回false、undefined、null、“、0或[],Handlebar将不会渲染块

所以

更新:

在所有浏览器上测试后,这在Firefox上不起作用。HandlebarsJS将其他参数传递给函数调用,这意味着在调用String.prototype.match时,第二个参数(即根据上述文档,match函数调用的Regexp标志)似乎正在传递。Firefox认为这是对String.prototype.match的不推荐使用,因此出现了中断

一种解决方法是为String JS对象声明一个新的函数原型,并使用它:

if(typeof String.includes !== 'function') {
    String.prototype.includes = function(str) {
        if(!(str instanceof RegExp))
            str = new RegExp((str+'').escapeRegExp(),'g');
        return str.test(this);
    }
}
在运行handlebar.compile()函数之前,请确保包含此JS代码,然后在模板中

{{#your_string}}
    {{#if (includes "what_youre_looking_for")}} 
        String found :)
    {{else}}
        No match found :(
    {{/if}}
{{/your_string}}
前面带有match的答案不适用于我,我在if语句中得到一个错误(类似于“必须只有一个参数”)

但是,我刚刚找到了解决方案,无需再编写任何帮助程序:

{{#if (eq person "John")}} hello {{/if}}

Mandrill邮件服务支持Handlebar,这里可以使用“backticks”来计算#if块中的逻辑表达式:

{{#if `operating_system == "OS X"`}}
  <p>Click here for instructions to install on a Mac</p>
{{elseif `operating_system == "Windows"`}}
  <p>Click here for instructions to install on a PC</p>
{{/if}}
{{{#如果`操作系统==“OSX”`}
单击此处获取在Mac上安装的说明

{{elseif`operating_system==“Windows”`} 单击此处获取在PC上安装的说明

{{/if}
我不知道这在总体上是否可行,但你应该试试看。
这对我来说很好

把手有一个称为“equal”的条件运算符,它接受两个参数:

1.变量

2.检查变量是否包含的内容

例如,要检查“状态”是否包含“全职”:

{{#equal status "Full Time"}}  //status is the variable and Full Time is the value your checking for.
    code to be executed
{{else}}
    code to be executed
{{/equal}}

简单、可重用的辅助函数的常见情况是,如果值相等,则返回string1;如果值不相等,则返回string2

示例:

Helper(我们称之为“ifEqual”并发送4个参数):

模板使用:

对于本例,假设模板接收到一个具有“transactionType”属性的“transaction”对象:
{transactionType:“expense”,description:“Copies”}

假设我们的模板有一个交易类型的
,有各种
s
,如图所示。我们希望使用手柄预先选择与transactionType值一致的选项

我们新的
{{ifEqual}
助手用于为
插入“selected”,匹配值为“expense”


小时费
固定费用
费用
付款
信用
借记

我会使用这样的助手:

Handlebars.registerHelper('ifeq', function (a, b, options) {
    if (a == b) { return options.fn(this); }
    return options.inverse(this);
});

Handlebars.registerHelper('ifnoteq', function (a, b, options) {
    if (a != b) { return options.fn(this); }
    return options.inverse(this);
});
然后在代码中:

{{#ifeq variable "string"}} 
    ... do this ... 
{{/ifeq}}
{{#ifnoteq variable "string"}} 
    ... do this ... 
{{/ifnoteq}}

不能直接比较把手中的字符串,必须使用辅助对象。我尝试了我的膝关节炎应用程序的上述解决方案,无法登记助手。下面的代码适用于我,我认为这也适用于express应用程序。我希望这对某人有帮助

server.js中的代码
var-handlebar=require('koa-handlebar');
常量isEqualHelperHandlerbar=函数(a、b、opts){
如果(a==b){
返回选项fn(本)
}否则{
返回选项反向(此)
} 
}
使用(把手)({
viewsDir:“./app/views”,
布局dir:“./app/views/layouts”,
defaultLayout:'main',
助手:{
如果相等:isEqualHelperHandlerbar
}

}));在Handlebar中,括号用于调用作为函数列出的第一项,使用(可选)后续项作为参数。因此,如果您可以自己设置上下文,那么可以在不使用Ember的情况下使用来自Ember的语法。例如:

{{#if sampleString == "This is a string"}}
...do something
{{/if}}
    context.eq = function(param1, param2) {
        return param1 === param2;
    }

    context.notEq = function(param1, param2) {
        return param1 !== param2;
    }
一旦这样做,您就可以使用标准的{{{if}和{{{除非}}块操作:

{{#if (eq someVar "someValue") }}
使用{{with}}或使用内联部分时,请小心切换上下文。您可能会忘记定义的“eq”函数。无论新环境如何,保证的工作方式:

{{#if (@root.eq someVar "someValue") }}

Node.js将此添加到server.js

const isEqual = function(a, b, opts) {
  if (a == b) {
    return opts.fn(this) 
  } else { 
    return opts.inverse(this) 
  } 
}

var hbs = require('hbs');
hbs.registerHelper('if_eq', isEqual);
使用,它提供了
eq
helper

尝试:

{{#是item.status“complete”} ...
{{/is}}

我遇到了与OP相同的困难,决定将调用转包给Javascript,而不是按照我的意愿弯曲把手

Javascript函数(在全局范围内)-

车把片段-

<select multiple id="batter_player_team">
  {{#each teamNamesForFilter}}
  <option value="{{this.id}}">                     <script>jsIfElse('{{this.is_active}}','Y','{{this.name}} *', '{{this.name}}');</script>
  </option>
   {{/each}} 
</select>

{{{#每个teamNamesForFilter}
jsIfElse({{this.is_active}}}','Y',{{{this.name}}*',{{{this.name}}');
{
<select multiple id="batter_player_team">
  {{#each teamNamesForFilter}}
  <option value="{{this.id}}">                     <script>jsIfElse('{{this.is_active}}','Y','{{this.name}} *', '{{this.name}}');</script>
  </option>
   {{/each}} 
</select>