从外部javascript访问template_toolkit变量

时间:2015-01-07 09:01:41

标签: javascript template-toolkit dancer

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

我正在使用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

在我的app.js文件中,我想对db fetch中的条目做一些事情 ($ sth-&gt; fetchall_hashref('system_id'))...

例如

window.onload = function  () { 

    console.log( "[% entries %]" );
};

再次,如果这是一个基石问题,请道歉...已经看过并且没有找到明显的答案。

谢谢

1 个答案:

答案 0 :(得分:0)

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

=== app.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对象将在页面源中可见,因此暴露所有属性和方法可能(将)存在安全风险。
  4. 你可能会发现你需要创建一些其他简单的&#39;包含app.js所需的最小字符串化输出的对象。这可能必须在Dancer代码中处理。