在 Yesod 中强制 Julius 重新插值或如何避免在客户端繁重的应用程序中对服务器进行双重标记

Posted

技术标签:

【中文标题】在 Yesod 中强制 Julius 重新插值或如何避免在客户端繁重的应用程序中对服务器进行双重标记【英文标题】:Force Julius re-interpolation in Yesod or how to avoid double-tagging the server in client-heavy app 【发布时间】:2013-06-30 10:22:48 【问题描述】:

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

新行应作为 JSON 对象发送到服务器并添加到那里的数据库中。 新行应立即添加到表中并且可见。

另外,

当用户刷新站点时,表格应该与添加一堆行后的外观相同。错误处理很棘手,但可能,而不是我的(当前)问题。

我的实现大致如下:

getHomeR = do
  records ← runDB $ selectList …
  defaultLayout $ do
    $(widgetFile "tableWidget")

关键部分是,我不想将这些行呈现为 html 服务器端,我希望发生这种情况客户端,因为客户端必须是 能够渲染它们! (并维护客户端和服务器端代码 以完全相同的方式呈现完全相同的东西让我印象深刻 容易出错的方法。)

因此,我通过 julius 插值将 records 放入 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));
    );
);

这是我能想到的最优雅的解决方案。它 避免必须进行 separate ajax 调用来读出记录,即我知道我可以添加一个从数据库中获取新记录并将其添加到 JS 的路由,但这让我觉得效率低下: 它涉及我想避免的另一次往返。反而, JS 和 HTML 建立在第一个请求上,所有内容都在一个请求中发送 快乐的一群。现在问题发生在重新加载时:


虽然records Haskell 变量的内容可能在页面之间改变 加载时,插值不会重新评估。 Yesod 假设 Julius 文件,包括其所有与 IO 相关的插值,保持不变,但 他们没有。我最终得到了一个 records javascript 变量,它与 Haskell 变量的内容,这对我来说是不可接受的。我需要 触摸 Julius 文件以使 Yesod 考虑更新它(我正在使用 默认脚手架。也许这就是问题所在?)


TL;DR:我将 IO 相关变量插入到 Julius 中,但如果这些变量的内容发生变化,客户端将看不到更新的 JavaScript 文件,直到我手动更改 Julius 文件的时间戳。我希望在 IO 操作的内容发生更改时重新插入 JavaScript 文件。或者,我们可以假设它们在每次请求时都会发生变化(即是否有某种到期期限我可以设置为零?)

感谢您阅读此墙 o' 文字 :-)


所以看起来这实际上是 Yesod 中的一个错误,正如 Michael Snoyman 所指出的那样。我在 github 上打开了这个issue。

【问题讨论】:

我在使用yesod devel 运行我的应用程序时遇到了同样的问题,但是当我像./mysampleapp Development 那样直接运行应用程序时并没有发生这种情况。我也想听听如何解决这个问题。 【参考方案1】:

这看起来像一个错误,我可以在yesod devel 站点中轻松地重现它。你能在问题跟踪器中打开一张票,这样它就不会丢失吗?

【讨论】:

谢谢!我打开了一个问题。 谢谢!我会尽快解决的。

以上是关于在 Yesod 中强制 Julius 重新插值或如何避免在客户端繁重的应用程序中对服务器进行双重标记的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Yesod 中捕获异常而不杀死站点?

Pandas:在多索引数据帧中重新索引和插值

Yesod:在 ghci 中运行“runDB”函数时键入实例错误

如何在 Yesod / Persistent 中正确使用 runDB

Yesod/Persistent 字段与 Eq

Yesod/Persistent 实体派生 Show