1

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

特别是,我希望有这样的路线:

/图片/#PictureId 获取

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

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

编辑:我决定将 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 ())
4

1 回答 1

0

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

于 2013-09-18T04:44:45.677 回答