在Yesod之外使用Julius

时间:2015-08-06 03:51:01

标签: haskell yesod yesod-julius

我试图弄清楚如何使用yesod之外的独立Julius发出Javascript代码:

{-# LANGUAGE QuasiQuotes #-}

import qualified Data.Text.Lazy.IO as LazyIO
import Text.Julius

main = do
    let delta = 1 :: Int
    LazyIO.putStrLn $ renderJavascript $ [julius|
        function f(x) {
          return x + #{delta};
        }
    |] undefined

但是我收到了这个错误:

t2.hs:8:48:
    No instance for (ToJavascript Integer)
      arising from a use of ‘toJavascript’
    In the expression: toJavascript delta
    ...

请帮忙。我不知道它需要什么,我刚刚开始看朱利叶斯。如果我删除了插值,那么它会成功呈现文本。

2 个答案:

答案 0 :(得分:3)

试试这个:

import qualified Data.Text.Lazy.IO as LazyIO
import Text.Julius
import Data.Aeson

main = do
    let delta = toJSON (1 :: Int)
    LazyIO.putStrLn $ renderJavascript $ [julius|
        function f(x) {
          return x + #{delta};
        }
    |] undefined

说明:

错误消息是delta需要ToJavascript个实例。查找ToJavascript类显示默认情况下定义了这些实例:

ToJavascript Bool    
ToJavascript Value   
ToJavascript RawJavascript   

缺少Int(或Integer)实例会解释错误消息。

但是,有一个Value个实例,通过使用Aeson库中的toJSON,我们可以将Int转换为Value

答案 1 :(得分:2)

使用rawJS可以使其正常工作:

{-# LANGUAGE QuasiQuotes #-}

import qualified Data.Text.Lazy.IO as LazyIO
import Text.Julius

main = do
    let delta = rawJS $ show (1 :: Int)
    LazyIO.putStrLn $ renderJavascript $ [julius|
        function f(x) {
          return x + #{delta};
        }
    |] undefined

将产生:

function f(x) {
  return x + 1       
}