Условный рендеринг с dmustache
Я использую 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}}';
1 ответ
Я нашел два способа решить эту проблему. Сначала используется условное в шаблоне, как
TEMPLATE = 'FirstName: {{FIRSTNAME}} {{#if MIDDLENAME <> ""}}MiddleName: {{MIDDLENAME}} {{/if}}LastName: {{LASTNAME}}';
Чтобы это работало, нужно также передать стандартных помощников для вызова Render, например
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.