从外部javascript访问模板_工具包变量

从外部javascript访问模板_工具包变量,javascript,template-toolkit,dancer,Javascript,Template Toolkit,Dancer,如果这是一个有点愚蠢的问题,我道歉 我正在使用dancer和template_工具包显示一些数据库查询的结果。我下面的代码似乎不像我希望的那样工作 在我的dancer.pl脚本中,我有: get '/dbqr' => sub { if (not session('logged_in') ) { send_error ("Not logged in", 401); } my $db = connect_db();

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

我正在使用dancer和template_工具包显示一些数据库查询的结果。我下面的代码似乎不像我希望的那样工作

在我的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
再次道歉,如果这是一个门槛问题。。。我环顾四周,没有找到明显的答案


谢谢这不是一个愚蠢的问题。请记住所涉及的处理阶段。当任何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>
这足以让你上路吗

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

  • 编码器的编码能力有限制
  • 你可能会得到非常大的物体
  • 生成的JSON对象将在页面源代码中可见,因此暴露所有属性和方法可能(将)存在安全风险
  • 您可能会发现您需要创建一些其他“简单”对象,其中包含app.js所需的最小字符串化输出。这可能必须在舞者代码中处理

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