Haskell 强制Julius在YesSOD中重新插值,或者如何避免在客户端应用程序中重复标记服务器
我的场景:一个站点显示一组来自持久后端的行。用户可以向这些行添加ajax样式(即不离开当前站点)。当点击submit按钮时,我希望在不加载其他页面的情况下发生两件事:Haskell 强制Julius在YesSOD中重新插值,或者如何避免在客户端应用程序中重复标记服务器,haskell,yesod,Haskell,Yesod,我的场景:一个站点显示一组来自持久后端的行。用户可以向这些行添加ajax样式(即不离开当前站点)。当点击submit按钮时,我希望在不加载其他页面的情况下发生两件事: 新行应作为JSON对象发送到服务器,并添加到数据库中 新行应立即添加到表中并可见 另外, 当用户刷新站点时,表的外观应该与添加一组行后的外观相同。错误处理是棘手的,但也是可能的,而不是我(当前)的问题 我的实施过程大致如下: getHomeR = do records ← runDB $ selectList …
- 新行应作为JSON对象发送到服务器,并添加到数据库中
- 新行应立即添加到表中并可见
- 当用户刷新站点时,表的外观应该与添加一组行后的外观相同。错误处理是棘手的,但也是可能的,而不是我(当前)的问题
我的实施过程大致如下:
getHomeR = do
records ← runDB $ selectList …
defaultLayout $ do
$(widgetFile "tableWidget")
关键的一点是,我不想将这些行呈现为HTML
服务器端,我希望这种情况发生在客户端,因为客户端必须是
能够渲染它们!(以及维护客户端和服务器端代码
以完全相同的方式呈现完全相同的东西,这让我觉得
容易出错的方法。)
因此,我通过julius插值将记录
放入JS变量中:
var records = #{toJSON records}; // the Haskell value containing the data.
renderRow = function(jsonObject) { … }
appendRowToTable = function(row) { … }
$(document).ready(function() {
$.each(records, function(i,v) {
appendRowToTable(renderRow(v));
});
});
这是我能想出的解决这个问题的最优雅的办法。信息技术
避免了为了读取记录而进行单独的ajax调用,也就是说,我知道我可以添加一个新的路由,从DB获取记录并将其添加到JS,但这让我觉得效率低下:这涉及到我希望避免的另一个往返。相反
JS和HTML是在第一个请求上构建的,所有内容都在一个请求中发送过来
快乐的一群。问题现在发生在重新加载时:
而
记录
Haskell变量的内容可能会在页面之间更改
加载时,不会重新计算插值。Yesod假设朱利叶斯
文件,包括其所有依赖IO的插值,保持不变,但
他们没有。最后我得到了一个records
JavaScript变量,该变量与
Haskell变量的内容,这在这里是不可接受的。我需要
触摸尤利乌斯文件,以便让YESod考虑更新它(我正在使用)
默认的脚手架。也许这就是问题所在?)
TL;DR:我将IO因变量插入到Julius中,但是如果这些变量的内容发生变化,客户端将无法看到更新的JavaScript文件,直到我手动更改Julius文件的时间戳。我希望在IO操作的内容更改时重新插入JavaScript文件。或者,我们可以假设它们在每次请求时都会发生变化(例如,是否有某种过期期限可以设置为零?) 感谢您阅读这面墙的文字:-)
所以,正如迈克尔·斯诺曼所指出的,这实际上是Yesod中的一个bug。我在github上打开了它。这看起来像一个bug,我可以在
yesod-devel
网站上相当轻松地复制它。你能在问题跟踪器中打开一张罚单,这样它就不会丢失吗?当我用YesSOD-devel
运行我的应用程序时,我遇到了同样的问题,但当我像/mysampleapp-Development
那样直接运行应用程序时,它没有发生。我也想听听如何解决这个问题。谢谢!我打开了一个问题。谢谢!我会尽快去做的。