2013-03-12 1 views
1

Скажем, у меня есть один шаблон Heist с двумя пользовательскими тегами <x/> и <y/>. Каждый тег привязан к Heist.Compiled.Splice. Теперь шаблон визуализируется при каждом запросе GET для определенного маршрута. Как я могу заменить <x/> на первое значение пары, <y/> заменить вторым значением той же пары, но вычисление IO, возвращающее пару, будет выполняться только один раз за запрос (и будет выполняться только на этом маршруте, а не на каждом маршруте, потому что некоторые не будут использовать шаблон вообще)?Как использовать одиночное вычисление по запросу в нескольких сращиваниях с помощью Heist?

ответ

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 
+0

Большое спасибо, точно ответ, на который я надеялся! – noteed