2012-11-30 2 views
9

Yesod 책 예제가 Yesod 웹 페이지에 설명되어 있습니다. 예 중 하나는 Chat application embedded in Wiki입니다. 나는 (위키 예제 코드가 포함되어 Wiki.hs에서 Chat 모듈을로드) ghci에서 그것을 시도 할 때, 나는 Chat.hs 아래의 오류 :일부 Yesod 예제를 시도 할 때 컴파일 오류가 발생합니다.

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.1yesod 1.1.4.1을 사용하고 있습니다.

업데이트 :

이 Hammar와의 제안 다음 수정되었습니다. Chat.hs에서 두 가지 변경을했습니다. rawJS에 대한

  1. 추가 import 문 :

    import Text.Julius (rawJS)

  2. 트랙 아래로 모든 Chat.hsjulius whamlet 내에서 # {} 블록의 인스턴스 및 {# rawJS ...}

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

    로 교체

    에서

답변

12

지금 테스트를 위해 Yesod가 설치되어 있지 않지만 this blog post에 따르면 JavaScript 식별자를 삽입 할 때 #{output}#{rawJS output} 등으로 변경해야합니다.

+0

감사합니다, @hammar. 그것은 정확히 문제였습니다. julius whamlet 안의 모든 # {} 블록을 추적하고 rawJS로 바꾼 후에 수정되었습니다. – Sal

5

10, Text에 대한 ToJavascript 인스턴스와 다른 유형이 제거되었습니다 : 패키지의 이전 버전에서, 그들은 단지 조건부 해제했다

-- | 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에 대해 yesod를 다시 작성해야합니다. 즉, 많은 패키지를 먼저 제거하거나 새 샌드 박스 (cabal-dev 또는 다른 샌드 박스 도구를 사용하는 경우)를 제거해야합니다. shakespeare-js-1.1.0ToJavascript

유일한 경우는 aeson 패키지 RawJavascript (Builder 주위 newtype 랩퍼) 및 Value (JSON 값의 일종)이다.

넌 그냥 RawJavascript 값을 얻기 위해 RawJavascript . Data.Text.Lazy.Builder.fromText

Text.Julius.toJavascript output 

output을 포장하고 실제 코드가 있다면 그것이 작동되도록하지만 TH-생성 된 이후, 당신은 TH를 해결해야 할 것입니다 수 출력 또는 쿼시 콰이어 (quasiquoter) - 둘 다 어떻게해야 하는지를 안다.

+0

감사합니다. @ daniel-fischer. 실제로 Hammar가 지적한 것처럼 rawJS는 빠져있었습니다. – Sal

관련 문제