【问题标题】:Conditional rendering with dmustache带有小胡子的条件渲染
【发布时间】:2018-03-01 14:48:47
【问题描述】:

我正在使用 dmustache (https://github.com/synopse/dmustache) 来呈现一些模板。我想知道如果字符串变量是空字符串,怎么不能渲染某个部分。

这个简化的程序呈现FirstName: Joe MiddleName: LastName: Doe,但我想要FirstName: Joe LastName: Doe,因为没有MiddleName(只有在这种情况下)。

program P;

uses
  System.SysUtils, SynMustache, SynCommons;

const
  TEMPLATE = 'FirstName: {{FIRSTNAME}} {{#MIDDLENAME}}MiddleName: {{MIDDLENAME}}{{/MIDDLENAME}} LastName: {{LASTNAME}}';
var
  Mustache: TSynMustache;
  Content: Variant;
begin
  Mustache := TSynMustache.Parse(TEMPLATE);
  TDocVariant.New(Content);
  Content.FirstName := 'Joe';
  Content.MiddleName := '';
  Content.LastName := 'Doe';
  WriteLn(Mustache.Render(Content));
  ReadLn;
end.

在模板中使用部分不会改变结果

TEMPLATE = 'FirstName: {{FIRSTNAME}} {{#MIDDLENAME}}MiddleName: {{MIDDLENAME}} {{/MIDDLENAME}}LastName: {{LASTNAME}}';

【问题讨论】:

    标签: delphi mustache mormot


    【解决方案1】:

    我找到了两种方法来解决这个问题。首先是在模板中使用条件,比如

    TEMPLATE = 'FirstName: {{FIRSTNAME}} {{#if MIDDLENAME <> ""}}MiddleName: {{MIDDLENAME}} {{/if}}LastName: {{LASTNAME}}';
    

    为此,还必须通过标准助手来调用渲染,例如

    Mustache.Render(Content, nil, TSynMustache.HelpersGetStandardList)
    

    第二个是将内容变量设置为 NULL 而不是空字符串(或根本不设置)并使用节(注意 {{.}} 在节内自我引用)

    const
      TEMPLATE = 'FirstName: {{FIRSTNAME}} {{#MIDDLENAME}}MiddleName: {{.}} {{/MIDDLENAME}}LastName: {{LASTNAME}}';
    var
      Mustache: TSynMustache;
      Content: Variant;
    begin
      Mustache := TSynMustache.Parse(TEMPLATE);
      TDocVariant.New(Content);
      Content.FirstName := 'Joe';
      Content.MiddleName := NULL; //you can also comment this line
      Content.LastName := 'Doe';
      WriteLn(Mustache.Render(Content));
      ReadLn;
    end.
    

    【讨论】:

    • Mustache 应该是无逻辑和数据驱动的。我认为这意味着不呈现数据的正确方法是将其包含在内容中。正如我们从您代码中的注释中看到的那样,您已经知道了 :) SynMustache 是不错的库,但我更喜欢 RenderJSON 而不是 Render(我们可以生成具有完整类型控制的 JSON,如果您想保存它更容易/更可预测记录,更容易检查调试时间等)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2012-02-22
    相关资源
    最近更新 更多