2015-05-15 16 views
7

Tôi muốn thực hiện một yêu cầu Ajax cơ bản, đó là tất cả.XhrRequest với phản xạ/phản xạ-dom

Tôi sử dụng reflex cho giao diện người dùng và Scotty cho chương trình phụ trợ. Bảng điều khiển Web của Firefox cho tôi biết yêu cầu đã thành công và tôi thấy kết quả mong đợi ở đó. Nhưng trang web chuyển đổi từ Just "default" thành Nothing thay vì Just "success!".

Dưới đây là hoàn chỉnh một ví dụ nhỏ:

import Reflex (holdDyn) 
import Reflex.Dom (button, el, mainWidget, display) 
import Reflex.Dom.Xhr (performRequestAsync, xhrRequest, decodeXhrResponse) 
import Reflex.Class (tag, constant) 
import Data.Default (def) 

main :: IO() 
main = do 
    mainWidget $ el "div" $ do 
    buttonEvent <- button "click me" 
    let defaultReq = xhrRequest "GET" "mystring" def --served by Scotty 
    asyncEvent <- performRequestAsync (tag (constant defaultReq) buttonEvent) 
    buttonDyn <- holdDyn (Just "default") $ fmap decodeXhrResponse asyncEvent 
    display buttonDyn 

Scotty phần:

{-# LANGUAGE OverloadedStrings #-} 
import Web.Scotty 
import Network.Wai.Middleware.Static 

main = scotty 3000 $ do 
    middleware $ staticPolicy (noDots >-> addBase "/mnt/b/haskell/try-reflex/hello.jsexe") 
    get "/" $ do 
    file "/mnt/b/haskell/try-reflex/hello.jsexe/index.html" 
    get "/mystring" $ html "success!" 

Kể từ khi công cụ gỡ lỗi cho tôi biết yêu cầu là một thành công, tôi nghi ngờ lỗi ở đâu đó gần decodeXhrResponse nhưng Tôi là một chút mất làm thế nào tôi nên tiến hành gỡ lỗi kể từ khi nó chỉ được biên dịch để (không đọc được) Javascript.

Tôi đã sử dụng tập lệnh Nix thử phản xạ từ GitHub để thiết lập mọi thứ và được biên dịch với ghcjs hello.hs trong môi trường Nix.

Chỉnh sửa: Thêm đầu ra của curl:

$ curl -G http://localhost:3000/mystring 
success!% 

Trả lời

6

Với sự giúp đỡ từ #reflex-frp trên freenode Tôi tìm thấy một giải pháp: thay thế decodeXhrResponse với _xhrResponse_body và sử dụng Text cho chuỗi mặc định làm việc:

buttonDyn <- holdDyn (Just $ T.pack "default") $ fmap _xhrResponse_body asyncEvent 

decodeXhrResponse mong đợi một số loại JSON và mặc dù tôi đã cố gắng phân phát JSON qua Scotty tại một thời điểm nhưng nó vẫn không hoạt động.

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