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

时间:2015-07-29 08:06:25

标签: dust.js

我正在寻找一种在两个{@eq}条件之间进行逻辑OR的方法。我能以一种直截了当的方式做到吗?

为了便于说明,请考虑以下示例。我正在迭代result数组。如果grp参数等于 all ,我不想过滤进入页面的内容。如果它不等于 all ,那么我想按group属性等于grp来过滤数组元素。该条件将在JS中表示为(grp == "all" || group == grp)。目前,在两种情况之间没有任何办法进行OR,我必须重复循环的BODY - 违反DRY原则。

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

1 个答案:

答案 0 :(得分:1)

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

{#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}
相关问题