2013-09-27 41 views
10

Trong dự án Yesod của tôi có các tuyến đường sau:Yesod: Sử dụng typesafe URL trong AJAX gọi

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

Tôi muốn yêu cầu nó về phía khách hàng với javascript:

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

Nhưng tôi có thể Không sử dụng @{ApiHideTHreadR} vì Yesod yêu cầu đối số của nó trên thời gian biên dịch. Giải pháp thích hợp cho việc này là gì, nếu tôi muốn URL API trông giống như api/board/1/1 và không phải là api/board?bid=1&tid=1? Tiếp tục sử dụng URL được định nghĩa theo cách thủ công như "/api/hide/thread/"+board+"/"+threadId?

Trả lời

2

Sau một số tìm kiếm, tôi tìm thấy số discussion này, trong đó đề nghị bạn thêm url làm thuộc tính "url dữ liệu" cho một phần tử nào đó. Và sau đó tải url từ phần tử. Something như thế này:

<div id="thread-1" [email protected]{ApiHideTHreadR}> 

var url = $("#thread-1").data("hide-url") 
+0

Tôi vẫn cần phải xác định các đối số 'ApiHideTHreadR', vì vậy tôi không thấy cách điều này giúp tôi. – arrowd

+1

Bạn nói đúng, nó không. – Obscaenvs

1

Những gì tôi luôn luôn làm là để loại bỏ các tham số đi qua rõ ràng trong các cuộc gọi đường và thay vào đó thay thế nó bằng:

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

Sau đó, bạn có thể sử dụng phong cách ajax thường xuyên:

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

Đối get phức tạp hơn để Haskell yêu cầu loại: https://github.com/yesodweb/yesod/wiki/Convert-get-params-into-a-haskell-record

Là mẫu đẹp.

+0

Điều này sẽ làm cho URL trông giống như '/ api/hide/thread? Board = 1 & thread = 2', nhưng tôi muốn'/api/hide/thread/1/2'. – arrowd

+0

Vâng tôi biết điều đó, nhưng nó cũng cho phép bạn truy cập vào trường Văn bản và trường Int mà bạn đang cố gắng gọi ... Tôi nghĩ đó là lực đẩy chính của câu hỏi, không làm cho nó trông giống hệt cú pháp tuyến đường. Lỗi của tôi – TallerGhostWalt

1

Bạn không thể sử dụng một tuyến đường kiểu an để kiểm tra tại thời gian biên dịch somthing rằng chỉ được biết đến tại thời gian chạy. Tôi nghi ngờ bạn biết điều này quá, nhưng đó là cảm giác duy nhất tôi có thể làm cho câu hỏi của bạn. Do đó, tùy chọn duy nhất của bạn là làm theo cách thủ công.

Các vấn đề liên quan