Yesod:在 AJAX 调用中使用类型安全的 URL
Yesod: Using typesafe URLs in AJAX calls
在我的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
?
经过一番搜索,我发现了这个讨论,建议您将 url 作为"data-url"属性添加到某个元素中。然后从元素加载 url。像这样:
<div id="thread-1" data-hide-url=@{ApiHideTHreadR}>
var url = $("#thread-1").data("hide-url")
我一直在做的是摆脱路由调用中传递的显式参数,而是将其替换为:
getApiHideThreadR::Handler JSON
getApiHideThreadR = do
rawTextParam <- lookupGetParam "text"
rawThreadId <- lookupGetParam "table"
(textParam,threadParam) <- someParseFunction rawTextParam rawThreadId
...
然后你可以使用常规的 ajax 样式:
$.getJSON("@{ApiHideThreadR}",{text:"sometext",tabe:"sometable"},success()...
对于更复杂的 get to haskell 类型请求:https://github.com/yesodweb/yesod/wiki/Convert-get-params-into-a-haskell-record
是一个很好的模板。
不能使用类型安全的路由在编译时检查仅在运行时知道的内容。我怀疑你也知道这一点,但这是我能对你的问题做出的唯一理解。因此,您唯一的选择是手动执行此操作。
相关文章:
- 类型错误:url未定义extjs 4正在填充组合框
- 模版启动错误-类型错误(“参数”url'必须是字符串,而不是“+类型的url”)
- 用于自动将一种类型的URL更改为另一种类型
- JS和iOS之间的类型安全
- Web套接字安全URL加密
- TypeScript 构造函数类型安全
- Yesod:在 AJAX 调用中使用类型安全的 URL
- 老计时器如何最好地管理Javascript中的类型安全
- Object.getPrototypeOf(val). tostring()确保DOM类型安全吗?
- 当数据类型为url时,jqgrid setColProp不起作用
- 在TypeScript中以类型安全的方式用静态函数从外部库扩展一个类
- 我如何用正则表达式检测任何类型的url
- 通过传递用户名和密码,在safari中使用javascript打开包含pdf文件的安全URL
- 接受或反对node缺乏类型安全
- JavaScript中是否有类型安全的比较操作符等价物
- javascript中的类型安全,或者如何避免很难检测到的类型相关错误
- 主干和TypeScript,一个不幸福的婚姻:构建一个类型安全的“get”
- 如果通过$.ajax请求安全url,则缺少身份验证提示
- 从任何类型的url提取域名
- 安全url's时使用ui路由器Angular Js