我正在尝试在Yesod网页上记录的Yesod
书籍示例。其中一个例子是Chat application embedded in Wiki。当我在ghci(从包含Wiki示例代码的Chat
加载Wiki.hs
模块)中尝试它时,我得到以下关于Chat.hs的错误:
Chat.hs:122:34:
Could not deduce (Text.Julius.ToJavascript Text)
arising from a use of `Text.Julius.toJavascript'
from the context (YesodChat master)
bound by the type signature for
chatWidget :: YesodChat master =>
(Route Chat -> Route master) -> GWidget sub master ()
at Chat.hs:(81,15)-(83,35)
Possible fix:
add an instance declaration for (Text.Julius.ToJavascript Text)
In the first argument of `Text.Julius.Javascript', namely
`Text.Julius.toJavascript output'
In the expression:
Text.Julius.Javascript (Text.Julius.toJavascript output)
In the first argument of `Data.Monoid.mconcat', namely
`[Text.Julius.Javascript
((Data.Text.Lazy.Builder.fromText . Text.Shakespeare.pack')
"\
\// Set up the receiving end\
\var output = document.getElementById(\""),
Text.Julius.Javascript (Text.Julius.toJavascript output),
Text.Julius.Javascript
((Data.Text.Lazy.Builder.fromText . Text.Shakespeare.pack')
"\");\
\var src = new EventSource(\""),
Text.Julius.Javascript
(Data.Text.Lazy.Builder.fromText
(_render_a3Yr (toMaster ReceiveR) [])),
....]'
我对Yesod图书馆还不是很熟悉。所以,我被上面的错误所困扰 - 我在其他Yesod示例中也看到了这个错误,其中调用了toWidget
函数。所以,它似乎与toWidget
函数有关。我将非常感谢您解决上述错误。
我将ghc 7.6.1
与yesod 1.1.4.1
一起使用。
更新
修正了Hammar的建议。我在Chat.hs
进行了两处更改。
为rawJS添加import语句:
import Text.Julius (rawJS)
在julius whamlet
中追踪Chat.hs
内所有#{}块的实例,并将其替换为{# rawJS ...}
var output = document.getElementById("#{rawJS output}");
var input = document.getElementById("#{rawJS input}");
答案 0 :(得分:12)
我目前没有安装Yesod来测试它,但根据this blog post,您只需将#{output}
更改为#{rawJS output}
,等插入JavaScript标识符。
答案 1 :(得分:5)
在shakespeare-js-1.1.0
中,ToJavascript
的{{1}}个实例以及其他一些类型已被删除:
Text
虽然在早期版本的软件包中,它们只是有条件地禁用了:
-- | A typeclass for types that can be interpolated in CoffeeScript templates.
class ToJavascript a where
toJavascript :: a -> Builder
#if 0
instance ToJavascript [Char] where toJavascript = fromLazyText . TL.pack
instance ToJavascript TS.Text where toJavascript = fromText
instance ToJavascript TL.Text where toJavascript = fromLazyText
instance ToJavascript Javascript where toJavascript = unJavascript
instance ToJavascript Builder where toJavascript = id
#endif
instance ToJavascript Value where toJavascript = fromValue
我不知道这是故意还是意图保持这样,或者只是遗忘的发展变化。
要按原样使用该示例,您需要针对#ifndef SAFER_INTERPOLATION
重建yesod。这意味着首先要卸载很多软件包,或者新的沙箱(如果你使用的是cabal-dev或其他一些沙盒工具)。
shakespeare-js < 1.1
中ToJavascript
的唯一实例是shakespeare-js-1.1.0
(Builder
周围的RawJavascript
包装)和Value
(JSON的类型)值{)来自newtype
包。
你可以将aeson
包裹在
output
在Text.Julius.toJavascript output
中获取RawJavascript . Data.Text.Lazy.Builder.fromText
值并使其工作如果它是真实代码,但由于它是TH生成的,您需要修复TH输出或quasiquoter - 既不其中我知道该怎么做。