2015-01-07 6 views
0

어리석은 질문 인 경우 사과드립니다.외부 자바 스크립트에서 template_toolkit 변수에 액세스하십시오.

댄서와 template_toolkit을 사용하여 일부 데이터베이스 쿼리의 결과를 표시하고 있습니다. 아래 코드는 내가 원하는 방식대로 작동하지 않는 것 같습니다. 내 dancer.pl 스크립트에서

내가 가진 :

내 show_entries.tt에서
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'), 
     }; 
}; 

...

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

내 app.js에

내가 함께 뭔가를하고 싶은 정보 파일 DB를의 항목은 예를 들어 ...

(> fetchall_hashref() 'SYSTEM_ID'$ sth-를) 가져 0
window.onload = function () { 

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

다시 말하지만,이 질문에 대한 사과는 ... 뻔한 답을 찾지 못했습니다.

감사합니다.

답변

0

바보 같은 질문이 아닙니다. 관련된 처리 단계를 염두에 두십시오. 모든 자바 스크립트가 브라우저에서 실행될 때까지는 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 코드에서 처리되어야합니다.