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