10

在我的 Yesod 项目中,我有以下路线:

/api/hide/thread/#Text/#Int      ApiHideThreadR   GET

我想用javascript在客户端请求它:

function hideThreadCompletely(threadId, board) {
    $.getJSON("/api/hide/thread/"+board+"/"+threadId, function(data) {
        $('#thread-'+threadId).hide();
    });
}

但我不能使用@{ApiHideTHreadR},因为 Yesod 需要它的编译时间参数。如果我希望 API URL 看起来像api/board/1/1而不是这样,那么正确的解决方案是什么api/board?bid=1&tid=1?继续使用手动定义的 URL 之类的"/api/hide/thread/"+board+"/"+threadId

4

3 回答 3

2

经过一番搜索,我发现了这个讨论,建议您将 url 作为“data-url”属性添加到某个元素。然后从元素加载 url。像这样的东西:

<div id="thread-1" data-hide-url=@{ApiHideTHreadR}>

var url = $("#thread-1").data("hide-url")
于 2013-09-27T14:54:52.340 回答
1

我总是做的是摆脱路由调用中传递的显式参数,而是将其替换为:

getApiHideThreadR::Handler JSON
getApiHideThreadR = do 
  rawTextParam <- lookupGetParam "text"
  rawThreadId  <- lookupGetParam "table"
  (textParam,threadParam) <- someParseFunction rawTextParam rawThreadId
  ... 

然后你可以使用常规的 ajax 样式:

$.getJSON("@{ApiHideThreadR}",{text:"sometext",tabe:"sometable"},success()...

对于更复杂的获取 haskell 类型的请求: https ://github.com/yesodweb/yesod/wiki/Convert-get-params-into-a-haskell-record

是一个不错的模板。

于 2013-09-27T15:09:44.070 回答
1

您不能使用类型安全的路线在编译时检查仅在运行时才知道的东西。我怀疑你也知道这一点,但这是我能理解你的问题的唯一意义。因此,您唯一的选择是手动进行。

于 2013-09-28T12:24:23.023 回答