9

YesodYesod Web ページに記載されている書籍の例を試しています。例の 1 つは、Wiki に埋め込まれた Chat アプリケーションです。ghci ( Wiki サンプル コードを含むChatモジュールのロード) で試してみると、Chat.hs に対して以下のエラーが発生します。Wiki.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 の提案に従って修正されました。で 2 つの変更を加えましたChat.hs

  1. rawJS のインポート ステートメントを追加します。

    import Text.Julius (rawJS)

  2. julius whamletin内の #{} ブロックのすべてのインスタンスを追跡しChat.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

それが意図的であり、そのままにしておくことを意図したものなのか、それとも忘れられていた開発の変更なのかはわかりません.

この例をそのまま使用するには、yesod を に対して再構築する必要がありますshakespeare-js < 1.1。これは、最初に多くのパッケージをアンインストールするか、新しいサンドボックス (cabal-dev またはその他のサンドボックス ツールを使用している場合) をアンインストールすることを意味します。

ToJavascriptinの唯一のインスタンスはshakespeare-js-1.1.0、パッケージからのRawJavascript(のnewtypeラッパーBuilder) とValue(JSON 値の型)です。aeson

あなたはただ包み込むことができoutputます

Text.Julius.toJavascript output

で値RawJavascript . Data.Text.Lazy.Builder.fromTextを取得し、RawJavascriptそれが実際のコードである場合は機能させますが、TH で生成されているため、TH 出力または準引用符を修正する必要があります。どちらも方法がわかりません。

于 2012-11-30T21:50:54.317 に答える