有没有办法在两个 {@eq} 条件之间进行逻辑或?

Is there a way to do logical OR between two {@eq} conditionals?

我正在寻找一种在两个 {@eq} 条件之间进行逻辑或运算的方法。我可以用一些直接的方式来做吗?

为了便于说明,请考虑以下示例。我正在遍历 result 数组。如果 grp 参数等于 all,我不想过滤进入页面的内容。如果不等于all,那么我想通过group属性等于grp来过滤数组元素。条件在JS中表示为(grp == "all" || group == grp)。目前,没有任何办法在这两个条件之间进行或运算,我不得不重复循环的主体——这违反了 DRY 原则。

{#result grp=grp}
  {@eq key=grp value="all"}
    BODY
  {:else}
    {@eq key=group value=grp}
      BODY
    {/eq}
  {/eq}
{/result}

特殊的 {@any} 帮助程序允许您表达逻辑或。 (还有一个 {@none} 逻辑 NAND 助手。)

{#result grp=grp}
  {@select}
    {@eq key=grp value="all"/}
    {@eq key=group value=grp/}
    {@any}BODY{/any}
  {/select}
{/result}

如果您需要做比这更复杂的事情——例如,如果 BODY 依赖于 grpgroup 的值——您总是可以编写一个自定义的 Dust 助手来将您的逻辑移至 Javascript。这是一个简短的示例,您可以在 documentation on context helpers.

中进一步阅读
{
  "filter": function(chunk, context, bodies, params) {
    var group = context.resolve(params.group);
    var grp = context.resolve(params.grp);

    if (grp == "all" || group == grp) {
      chunk = chunk.render(bodies.block, context.push({
        somethingNewBasedOff: "the value of group and grp"
      }));
    }

    return chunk;
  }
}

然后你会像这样使用它:

{#result grp=grp}
  {#filter group=group grp=grp}
    The filter test passed. The new data I added to the context is {somethingNewBasedOff}
  {/filter}
{/result}