Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 强制Julius在YesSOD中重新插值,或者如何避免在客户端应用程序中重复标记服务器_Haskell_Yesod - Fatal编程技术网

Haskell 强制Julius在YesSOD中重新插值,或者如何避免在客户端应用程序中重复标记服务器

Haskell 强制Julius在YesSOD中重新插值,或者如何避免在客户端应用程序中重复标记服务器,haskell,yesod,Haskell,Yesod,我的场景:一个站点显示一组来自持久后端的行。用户可以向这些行添加ajax样式(即不离开当前站点)。当点击submit按钮时,我希望在不加载其他页面的情况下发生两件事: 新行应作为JSON对象发送到服务器,并添加到数据库中 新行应立即添加到表中并可见 另外, 当用户刷新站点时,表的外观应该与添加一组行后的外观相同。错误处理是棘手的,但也是可能的,而不是我(当前)的问题 我的实施过程大致如下: getHomeR = do records ← runDB $ selectList …

我的场景:一个站点显示一组来自持久后端的行。用户可以向这些行添加ajax样式(即不离开当前站点)。当点击submit按钮时,我希望在不加载其他页面的情况下发生两件事:

  • 新行应作为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
那样直接运行应用程序时,它没有发生。我也想听听如何解决这个问题。谢谢!我打开了一个问题。谢谢!我会尽快去做的。