2012-11-30 6 views
9

Я пытаюсь использовать Yesod примеры книг, описанные на веб-странице Yesod. Один из примеров - для Chat application embedded in Wiki. Когда я пытаюсь его в GHCI (загрузка Chat модуля из Wiki.hs, который содержит Wiki пример коду), я получаю ошибку ниже для 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, где вызывается функция toWidget. Таким образом, это похоже на функцию toWidget. Я буду признателен за помощь в устранении вышеуказанной ошибки.

Я использую ghc 7.6.1 с yesod 1.1.4.1.

Update:

Fixed следующее предложение Хаммар в. Я сделал два изменения в Chat.hs. Заявление

  1. Добавить импорт для rawJS:

    import Text.Julius (rawJS)

  2. выследить все экземпляры # {} блоки в julius whamlet в Chat.hs, и заменить их {# rawJS ...}

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

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

ответ

12

У меня нет Yesod для тестирования на данный момент, но в соответствии с this blog post вам нужно просто изменить #{output} на #{rawJS output} и т. Д. При интерполяции идентификаторов JavaScript.

+0

спасибо, @hammar. Это была проблема. Исправлено, после того как я отследил каждый блок # {} внутри julius whamlet и заменил его на rawJS. – Sal

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 или какой-либо другой инструмент песочницы).

Единственные экземпляры ToJavascript в shakespeare-js-1.1.0 являются RawJavascriptnewtype оберткой Builder) и Value (тип для значений JSON) из aeson пакета.

Вы можете просто обернуть output в

Text.Julius.toJavascript output 

в RawJavascript . Data.Text.Lazy.Builder.fromText, чтобы получить значение RawJavascript и заставить его работать, если бы реальный код, но так как это TH-порождена, вы должны были бы исправить TH выход или квазикватер - ни один из которых я не знаю, как это сделать.

+0

Спасибо @ daniel-fischer. Действительно, rawJS отсутствовал, как указал Хаммар. – Sal

Смежные вопросы