道歉,如果这是一个有点愚蠢的问题。
我正在使用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 %]" );
};
再次,如果这是一个基石问题,请道歉...已经看过并且没有找到明显的答案。
谢谢
答案 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对象:
你可能会发现你需要创建一些其他简单的&#39;包含app.js所需的最小字符串化输出的对象。这可能必须在Dancer代码中处理。