2016-03-02 27 views
2

對於Yesod我很新,現在嘗試開發一個前端網站和一個後端restful webservice。要從網站訪問API,我使用AJAX請求。對於請求的網址,我想用莎士比亞的模板像電話:Yesod:julius模板中的參數化處理程序

$.ajax({ 
    url: '@{PersonR}', 
    type: 'GET', 
    contentType: "application/json", 
    data: JSON.stringify({...}), 
    success: function (data) {...} 
}); 

在後臺的網站我PersonR處理器路線定義如下:

/api/person/#Int/get PersonR GET 

對於這項工作的處理程序像

getPersonR :: Int -> Handler Value 

但是,現在朱利葉斯模板需要一個參數是一個有效的。我嘗試了一下,發現我也可以在@ {...}中直接使用haskell代碼。也許我錯過了doku中的那個點。 問題1:有沒有辦法說明可以在JavaScript中給出一個參數?也許用渲染器來輸出這樣的東西:

function(var1){return '/api/person/'+var1+'/get';} 

我認爲這缺乏類型安全點。這導致了我的第二個問題(哪一種會否定第一個問題):還有其他方法可以將數據導入客戶端的URL中嗎?

回答

1

我還沒有使用這個包,但yesod-js-routes似乎它符合法案。基本上這個軟件包會接收你的路由文件並生成你可以用來創建URL的Javascript函數。

該軟件包在一段時間內沒有看到有效的開發,但基於測試它仍然正常工作。它不在Hackage上,但它是一個文件,所以我只是將它複製到我的項目中(我還需要將import Prelude添加到該文件中,並將mtl添加到Cabal文件的構建依賴部分)。該項目的自述文件涵蓋了您需要執行的軟件包的基本集成。

下面是一些示例輸出。對於這個路線文件:

/static StaticR Static appStatic 
/auth AuthR Auth getAuth 

/favicon.ico FaviconR GET 
/robots.txt RobotsR GET 

/HomeR GET POST 

/comments CommentR POST 
/jsRoutes JSRoutesR GET 
/test/#Text/#Integer TestR GET POST 

我有此Javascript:

; 
var jsRoutes = {}; /* Subsite not supported */ ; /* Subsite not supported */ ; 
jsRoutes.FaviconR = { 
    get: function() { 
     return { 
      method: "get", 
      url: "/favicon.ico/" 
     }; 
    } 
}; 
jsRoutes.RobotsR = { 
    get: function() { 
     return { 
      method: "get", 
      url: "/robots.txt/" 
     }; 
    } 
}; 
jsRoutes.HomeR = { 
    get: function() { 
     return { 
      method: "get", 
      url: "/" 
     }; 
    }, 
    post: function() { 
     return { 
      method: "post", 
      url: "/" 
     }; 
    } 
}; 
jsRoutes.CommentR = { 
    post: function() { 
     return { 
      method: "post", 
      url: "/comments/" 
     }; 
    } 
}; 
jsRoutes.JSRoutesR = { 
    get: function() { 
     return { 
      method: "get", 
      url: "/jsRoutes/" 
     }; 
    } 
}; 
jsRoutes.TestR = { 
    get: function() { 
     return { 
      method: "get", 
      url: "/test/" + arguments[0] + "/" + arguments[1] + "/" 
     }; 
    }, 
    post: function() { 
     return { 
      method: "post", 
      url: "/test/" + arguments[0] + "/" + arguments[1] + "/" 
     }; 
    } 
}; 

對於像TestR的路線,你可以撥打:

jsRoutes.TestR.get("a",2).url 

返回

"/test/a/2/" 

不幸的是, neined Javascript和Javascript語言正在做任何事情來防止向該函數傳遞3個參數,或傳遞錯誤類型的參數。我不知道你的期望是什麼,但Javascript代碼生成看起來很簡單,你可以改進生成的東西。

+0

這是第一個問題的解決方案,但它是類型安全嗎?我認爲如果至少引入了對原始類型的javascript檢查(如.isNumber(...)),則包可以得到改進 –

+0

這不是類型安全的,不是。完全類型安全是非常棘手的,因爲您可以將任意類型作爲路由參數引入,但是您可以爲生成的代碼添加一些基本類型安全性。如果你對類型安全非常認真,你可能會考慮一種與Javascript不同的前端語言,儘管 – MaxGabriel

+0

@RenéMartin - 即使你在javascript中做了「類型檢查」,它也不會是類型安全的,因爲斷言會拋出異常。如果你想要類型安全的前端代碼,我推薦使用PureScript。 – pyrospade