Есть ли способ рекурсивного вызова шаблона Rythm на основе какого-либо условия?

В настоящее время я использую Rythm для создания некоторых фрагментов - в сочетании с AST, так как шаблоны зависят от файлов Java.

Вызов шаблонов работает как положено. С одним неожиданным поведением. Я хотел бы вызвать шаблон рекурсивно, но кажется, что это невозможно.

Шаблон Foo.html

@args String someString, boolean recursion

Calling foo template with recursion: @recursion
@if(recursion) {
    A recursion was requested: @recursion
    @foo(someString, false)
}

Обратите внимание, что это обеспечивает только 1 уровень рекурсии в соответствии с намерением для этого примера. Тем не менее, я хотел бы использовать условие вместо false в пределах @foo(someString, false) линия позже.

Вы можете попробовать фрагмент здесь, просто скопировав и вставив предоставленный пример в foo.html,

Сообщение об ошибке

The method foo(String, boolean) is undefined for the type Cfoo_html__R_T_C__

Template: /foo.html

Relevant template source lines:
-------------------------------------------------
   1: @args String someString, boolean recursion
   2:     
   3:     Calling foo template with recursion: @recursion
   4:     @if(recursion) {
   5:       A recursion was requested: @recursion
>> 6:         @foo(someString, false)
   7:     }

/*
 * Omitted for the sake of readability.
 */

Теперь ошибка не связана с рекурсией. Тем не менее, это сообщение об ошибке, которое я вижу в Eclipse.

Я предполагаю, что при вызове шаблона невозможно вызвать его внутри себя, потому что Ритм ищет только другие шаблоны - или так кажется.

Используйте ссылку выше, чтобы получить доступ к Rythm Fiddle, поместите код внутри bar.html вместо foo.html - изменить строку № 6 с @foo(someString, false) в @bar(someString, false),

Теперь поместите следующую строку внутри foo.html:

@bar("foo", true)

При этом ошибка меняется на:

java.lang.SecurityException: java.util.concurrent.TimeoutException

Я думаю, что это подтверждает мое предположение выше, так как теперь Ритм, кажется, находит шаблон (или метод, то есть). И это в основном то, где я застрял.

Итак, вопрос: есть ли способ рекурсивно вызвать шаблон Ритма, основанный на каком-то условии?

Я также открыт для других предложений, поскольку рекурсии обычно могут обрабатываться не рекурсивно. Я просто хочу избежать дублирования кода.

1 ответ

Решение

Ритм поддержка @this() директива для загрузки шаблона рекурсивным способом. Смотрите http://play-rythm-demo.appspot.com/demo/fibonacci

Однако, похоже, что есть введенная ошибка, и теперь она будет повышаться StackruError даже когда указано условие завершения. Пожалуйста, отправьте отчет об ошибке на https://github.com/rythmengine/rythmengine/issues

Обновления

StackruError это вызвано boolean тип. Все работает хорошо, если использовать переменные другого типа для контроля завершения рекурсивного вызова.

@args String foo, int i

<h1>@foo</h1>
Calling foo template with recursion: @i
@if(i > 1) {
A recursion was requested: @i
@this({foo: foo, recursion: false, i: (i - 1)})
}

Ниже приведен тест, выполненный на скрипке ритма

Другие вопросы по тегам