2015-01-07 4 views
0

Извините, если это немного глупый вопрос.Доступ к переменной template_toolkit из внешнего javascript

Я использую 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 файл я хотел бы сделать что-то с записи из БД выборки ($ sth-> fetchall_hashref ('system_id')) ...

, например

window.onload = function () { 

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

Опять же, извиняюсь, если это вопрос с порогом ... огляделся и не нашел явного ответа.

Спасибо

ответ

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 будет виден в источнике страницы, поэтому выявление всех атрибутов и методов может (будет) представлять угрозу безопасности.

Возможно, вам понадобится создать другой «простой» объект, содержащий минимальный строковый вывод, который требуется app.js. Это, вероятно, должно быть обработано в коде Dancer.

Смежные вопросы