从外部JavaScript访问template_toolkit变量

access template_toolkit variable from external javascript

本文关键字:toolkit 变量 template JavaScript 访问 从外部      更新时间:2023-09-26

如果这是一个有点愚蠢的问题,请道歉。

我正在使用dancer和template_toolkit来显示某些数据库查询的结果。我在下面的代码似乎没有按照我希望的方式工作。

在我的 dancer.pl 脚本中,我有:

get '/dbqr' => sub {
       if (not session('logged_in') )
       {
           send_error ("Not logged in", 401);
       }
       my $db = connect_db();
       my $sql = io->file('file.sql')->slurp;    # Read an entire file
       my $sth = $db->prepare($sql) or die $db->errstr;
       $sth->execute or die $sth->errstr;
       set_flash("Pulled data from db");
       template 'show_entries.tt', {
                'msg' => get_flash(),
                'add_entry_url' => uri_for('/add'),
                'entries' => $sth->fetchall_hashref('system_id'),
       };
};

在我的show_entries.tt...

some other html     
<script type="text/javascript" src="app.js"></script>
some other html

在我的应用程序中.js我想对数据库获取中的条目做一些事情( $sth->fetchall_hashref('system_id') )...

例如

window.onload = function  () { 
    console.log( "[% entries %]" );
};

再次道歉,如果这是一个门槛问题...看了看,没有找到明显的答案。

谢谢

这不是

一个愚蠢的问题。请记住所涉及的处理阶段。当任何Javascript在浏览器中执行时,TT的服务器端渲染已经结束了。因此,您的TT代码必须进行安排以生成JS所需的任何内容。

如果要使用单独的 app.js 文件,它只能包含 JS。(如果在模板中内联 JS,还有其他一些选项。

但基本上它归结为这样的东西:

=== show_entries.tt ===

[%- USE JSON.Escape; -%]
<script type="text/javascript" src="app.js"></script>
<script>
    var entries = [% entries.json %];
</script>

=== 应用程序.js ===

window.onload = function  () { 
    for (entry in entries) {
        console.log( "Entry Text: %s", entry.text ); //where 'text' is an attribute of the original TT entries hash
    }
};

这足以让你上路吗?

注意:在将数据库对象直接转换为 JSON 对象时,您确实需要小心一点,原因如下:

  1. 编码器能够编码的内容存在限制;
  2. 你可能会得到非常大的物体;
  3. 生成的 JSON 对象将在页面源代码中可见,因此公开所有属性和方法可能(将)存在安全风险。

您可能会发现需要创建一些其他"简单"对象,其中包含 app.js 所需的最小字符串化输出。这可能必须在 Dancer 代码中处理。