我正在使用 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 ())