Есть ли способ рекурсивного вызова шаблона 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)})
}
Ниже приведен тест, выполненный на скрипке ритма