9

我正在尝试YesodYesod 网页上记录的书籍示例。示例之一是嵌入在 Wiki 中的 Chat 应用程序。当我在 ghci 中尝试时(Chat从中加载包含 Wiki 示例代码的模块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 库还不是很熟悉。所以,我被上述错误难住了——我在其他toWidget调用函数的 Yesod 示例中也看到了这个错误。因此,它似乎与toWidget功能有关。我将感谢帮助解决上述错误。

我正在ghc 7.6.1使用yesod 1.1.4.1.

更新:

按照 Hammar 的建议进行了修复。我在Chat.hs.

  1. 为 rawJS 添加导入语句:

    import Text.Julius (rawJS)

  2. 跟踪 in 中 #{} 块的所有实例julius whamletChat.hs并将它们替换为{# rawJS ...}

    var output = document.getElementById("#{rawJS output}");

    var input = document.getElementById("#{rawJS input}");

4

2 回答 2

12

我目前没有安装 Yesod 来测试它,但根据这篇博文,在插入 JavaScript 标识符时你应该只需要更改#{output}#{rawJS output}等等。

于 2012-11-30T22:08:48.413 回答
5

shakespeare-js-1.1.0中, 和其他一些类型的ToJavascript实例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

我不知道这是否是故意的并且打算保持如此,或者只是一个被遗忘的发展变化。

要按原样使用该示例,您需要针对shakespeare-js < 1.1. 这意味着首先卸载很多包,或者一个新的沙箱(如果你使用的是 cabal-dev 或其他一些沙箱工具)。

in的唯一实例是包ToJavascriptshakespeare-js-1.1.0RawJavascriptnewtype包装器Builder)和Value(JSON 值的类型)aeson

你可以output换成

Text.Julius.toJavascript output

RawJavascript . Data.Text.Lazy.Builder.fromText如果它是真实代码,则获取一个值RawJavascript并使其工作,但由于它是 TH 生成的,因此您需要修复 TH 输出或 quasiquoter - 我都不知道该怎么做。

于 2012-11-30T21:50:54.317 回答