Yesod: использование типов URL-адресов в вызовах AJAX
В моем проекте 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 требует его аргументов во время компиляции. Какое правильное решение для этого, если я хочу, чтобы URL-адреса API выглядели как api/board/1/1
, а не api/board?bid=1&tid=1
? Продолжайте использовать указанный вручную URL-адрес, например "/api/hide/thread/"+board+"/"+threadId
?
Ответы
Ответ 1
После некоторого поиска я нашел этот обсуждение, где предлагается добавить URL-адрес в качестве атрибута "data-url" к некоторому элементу, А затем загрузите url из элемента.
Что-то вроде этого:
<div id="thread-1" [email protected]{ApiHideTHreadR}>
var url = $("#thread-1").data("hide-url")
Ответ 2
То, что я всегда делаю, это избавиться от явного параметра, передаваемого в вызове маршрута, и вместо этого заменить его на:
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
Хороший шаблон.
Ответ 3
Вы не можете использовать безопасный тип для проверки во время компиляции somthing, которое известно только во время выполнения. Я подозреваю, что вы тоже это знаете, но это единственный смысл, который я могу решить из вашего вопроса. Таким образом, ваш единственный вариант делает это вручную.