【问题标题】:Yesod: Using typesafe URLs in AJAX callsYesod:在 AJAX 调用中使用类型安全的 URL
【发布时间】:2013-10-03 12:40:47
【问题描述】:

在我的 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 URLS 看起来像 api/board/1/1 而不是 api/board?bid=1&tid=1,那么正确的解决方案是什么?继续使用手动定义的 URL,例如 "/api/hide/thread/"+board+"/"+threadId?

【问题讨论】:

    标签: javascript ajax haskell yesod


    【解决方案1】:

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

    <div id="thread-1" data-hide-url=@{ApiHideTHreadR}>
    
    var url = $("#thread-1").data("hide-url")
    

    【讨论】:

    • 我仍然需要指定ApiHideTHreadRs 参数,所以我看不出这对我有什么帮助。
    【解决方案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()...
    

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

    是一个不错的模板。

    【讨论】:

    • 这会使 URL 看起来像 /api/hide/thread?board=1&amp;thread=2,但我想要 /api/hide/thread/1/2
    • 是的,我知道,但它也让您可以访问您试图调用的 Text 字段和 Int 字段...我认为这是问题的主要重点,而不是让它看起来与路由语法完全一样。我的错误
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2013-11-30
      • 1970-01-01
      • 2015-01-04
      • 2017-02-11
      • 1970-01-01
      • 2013-07-15
      • 2022-11-30
      • 1970-01-01
      • 2019-06-26
      相关资源
      最近更新 更多