简体   繁体   中英

Compare template helper values in Spacebars {{#if}} block

I need to compare two template helper values that are located in nested templates. I was wondering if there is an easy way to compare two template helpers (one from the parent template) in an {{#if}} statement like so:

{{#each bids}}
  {{#if bid.price===../job.price}}
    <span>some text</span>
  {{else}}
    <span>some other text</span>
  {{/if}}
{{/each}}

If you can't do this, I guess the other option is to use Template.parentData in a new template inside the each block? I'm not opposed to this, just the way I outlined above would be much faster and simpler if it's possible. Thanks.

Something like this might work for you:

Template.registerHelper('_', function(){
    return _
})
{{#each bids}}
  {{#if _.isEqual bid.price ../job.price}}
    <span>some text</span>
  {{else}}
    <span>some other text</span>
  {{/if}}
{{/each}}

As a bonus, you not only get _.isEqual , but all _.* functions.

I believe you are right, spacebars doesn't support logical statements in the #if condition. But you can easily define a new block helper that does:

HandlebarsRegister.registerHelper('ifx', function(conditional, options) {
    var truthValue = false;
    try {
        truthValue = eval(conditional);
    } catch (e) {
        console.log("Exception in #ifx evaluation of condition: ",
                    conditional, e);
    }
    if (truthValue) {
        return options.fn(this);
    } else {
        return options.inverse(this);
    }
});

and then use

{{#each bids}}
  {{#ifx "bid.price===../job.price"}}
    <span>some text</span>
  {{else}}
    <span>some other text</span>
  {{/ifx}}
{{/each}}

The only downside is that you will need to write your condition as a string and eval is not exactly elegant. But hey, it works.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM