Yesod和REST Ajax

时间:2013-09-17 22:24:33

标签: ajax yesod history.js

我正在使用Yesod构建一个Ajax应用程序(使用jQuery,但我认为这对我的问题不重要)。基本上,我想要的是服务器根据是否发送XMLHttpRequest标头发送相同数据的不同表示。 (所有这一切的要点是使用像history.js

这样的javascript库

特别是,我希望有一条路线:

/ picture /#PictureId GET

当没有XHR标题访问时,通过转到默认布局来处理 - 或者更好的是,通过最终将被默认布局包装的小部件处理,并且当通过XHR请求访问时,只发送一个小部件的HTML表示。

我该如何处理?我想我可以创建一个自定义的类似defaultLayout的函数来将Widgets包装在逻辑中。这是明智的,还是有更好的方法?

编辑:我决定将Yesod类中的defaultLayout方法覆盖为:

defaultLayout widget = do
    req <- waiRequest
    let reqwith = lookup "X-Requested-With" $ requestHeaders req
    when (maybe False (== "XMLHttpRequest") reqwith) $ do
      (PageContent _ _ w) <- widgetToPageContent widget

      giveUrlRenderer $ [hamlet| ^{w} |]
    ...

但是现在我收到的类型错误我不太明白

Couldn't match type `blaze-markup-0.5.1.5:Text.Blaze.Internal.MarkupM ()'
              with `()'
Expected type: HandlerT App IO ()
  Actual type: HandlerT
                 App IO (blaze-markup-0.5.1.5:Text.Blaze.Internal.MarkupM ())

1 个答案:

答案 0 :(得分:0)

你应该看看这一章:http://www.yesodweb.com/book/restful-content