2013-09-27 13 views
10

W moim projekcie Yesod mam następującą trasę:Jesod: Korzystanie typesafe adresy URL AJAX wzywa

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

Chcę poprosić go po stronie klienta z javascript:

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

ale mogę użyj @{ApiHideTHreadR}, ponieważ Yesod wymaga argumentów podczas kompilacji. Jakie jest odpowiednie rozwiązanie, jeśli chcę, aby adresy URL interfejsu API wyglądały tak: api/board/1/1, a nie api/board?bid=1&tid=1? Kontynuuj używanie ręcznie zdefiniowanych adresów URL, takich jak "/api/hide/thread/"+board+"/"+threadId?

Odpowiedz

2

Po przeszukaniu znalazłem ten discussion, gdzie sugeruje się dodanie adresu url jako "danych-url" do jakiegoś elementu. A następnie załaduj adres URL z elementu. coś takiego:

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

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

Nadal muszę podać argumenty 'ApiHideTHreadR's, więc nie rozumiem, w jaki sposób to mi pomaga. – arrowd

+1

Masz rację, nie ma. – Obscaenvs

1

Co ja zawsze się pozbyć wyraźnej parametrów przejścia w zaproszeniu trasy i zamiast zastąpić go:

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

Następnie można użyć zwykłego stylu ajax:

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

dla bardziej złożonych dostać się do żądań Haskell Typ: https://github.com/yesodweb/yesod/wiki/Convert-get-params-into-a-haskell-record

Czy ładny szablon.

+0

Powoduje to, że adres URL będzie wyglądać jak '/ api/hide/thread? Board = 1 & thread = 2', ale chcę'/api/hide/thread/1/2'. – arrowd

+0

Tak, wiedziałem o tym, ale daje ci również dostęp do pola Tekst i pola Int, do którego próbujesz zadzwonić ... Sądziłem, że to główny nacisk tego pytania, a nie uzyskanie dokładnie takiej samej składni trasy. Mój błąd – TallerGhostWalt

1

Nie można użyć typu bezpieczne trasy, by sprawdzić na kompilacji somthing, który jest znany tylko w czasie wykonywania. Podejrzewam, że ty o tym wiesz, ale to jedyny sens, jaki mogę zrobić z twojego pytania. Tak więc jedyną opcją jest ręczne wykonanie.