Скажем, у меня есть один шаблон Heist с двумя пользовательскими тегами <x/>
и <y/>
. Каждый тег привязан к Heist.Compiled.Splice
. Теперь шаблон визуализируется при каждом запросе GET
для определенного маршрута. Как я могу заменить <x/>
на первое значение пары, <y/>
заменить вторым значением той же пары, но вычисление IO, возвращающее пару, будет выполняться только один раз за запрос (и будет выполняться только на этом маршруте, а не на каждом маршруте, потому что некоторые не будут использовать шаблон вообще)?Как использовать одиночное вычисление по запросу в нескольких сращиваниях с помощью Heist?
1
A
ответ
1
Ваш вопрос очень похож на пример Лица в compiled splices tutorial. Вам нужно создать родительский сплайс, который будет выполнять общие вычисления. Назовите это computeXY
. Ваш шаблон будет выглядеть следующим образом:
<computeXY>
<p>The first value is <x/>.</p>
<p>The second value is <y/>.</p>
</computeXY>
computeXY
сплайсинга будет выполнять вычисления и использовать runChildrenWith шаблон, чтобы результаты этого вычисления доступной для своих детей, как <x/>
и <y/>
тегов. Однако шаблон runChildrenWith работает по-разному с скомпилированными сращиваниями. Вот как это будет реализовано с использованием новых функций API, которые были добавлены с момента написания учебника:
import Blaze.ByteString.Builder.Char8 (fromText)
import Heist.Compiled
runtimeTupleComputation = return ("foo", "bar")
splices = [ ("x", fromText . fst)
, ("y", fromText . snd)
]
computeXYSplice = withPureSplices runChildren splices runtimeTupleComputation
Большое спасибо, точно ответ, на который я надеялся! – noteed