Jaký je doporučený způsob na include javascriptu?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
mr.mac
Člen | 87
+
0
-

Řeším možná trochu malichernou věc, jak správně includovat do šablony javascript, kterému je třeba předat v proměnné data. Typicky můj častý případ, použití grafů na stránce pomocí komponenty highcharts. Jde mi to to, aby IDE (v mém případě netbeans) správně zobrazovalo a kontrolovalo syntaxi.
Logicky se nabízí tento způsob: Rodičovská šablona řekněme default.latte bude includovat šablonu graph.latte takto:

/*default.latte*/
...
{include 'graph.latte', data => $data}
<div id="container" class="graph"></div>
...

/*graph.latte*/
<script type='text/javascript' src='{$basePath}/js/highcharts.js'></script>
<script type="text/javascript">
$(function () {
        var data = {$data},
            name = 'Skladba nákladů';
        var chart = $('#container').highcharts({
            chart: {
                type: 'bar',
            },
            title: {
                text: 'Můj graf'
            },
	...
            series: [{
                name: name,
                data: data
            }],
        })
        .highcharts();
    });
...
</script>

V netbeans IDE se při editaci graph.latte krásně zvýrazňuje syntaxe jak má a tak to asi má být.
Kde je problém? Problém je v tom, že na stránce se graf nevykreslí. Když přesunu z graph.latte první 2 (a poslední) řádky do default.latte (viz násl. kód), tak se graf vykreslí, ale v editoru netbeans je syntaxe latte nezvýrazněná a špatně se ladí javascript.

/*default. latte*/
...
<script type='text/javascript' src='{$basePath}/js/highcharts.js'></script>
<script type="text/javascript">
	{include 'graph.latte', data => $data}
</script>
<div id="container" class="graph"></div>
...

/*graph.latte*/
$(function () {
        var data = {$data},
            name = 'Skladba nákladů';
        var chart = $('#container').highcharts({
            chart: {
                type: 'bar',
            },
	...
            series: [{
                name: name,
                data: data
            }],
	...

Třetí variantou je namísto include latte includovat javascript:

<script type='text/javascript' src='{$basePath}/js/highcharts.js'></script>
<script type="text/javascript">
	{include 'graph.js', data => $data}
</script>

Zde se syntaxe v IDE hlídá, jen to latte makro není zvýrazněno.
Má někdo obdobné/jiné zkušenosti? Rád bych „definitivně“ toto dilema uzavřel a vydal se pokud někde dělám chybu – ideálně první cestou – tedy pokud se bude skript spuštět. Díky za radu, názor.

Editoval mr.mac (8. 12. 2013 13:42)

enumag
Člen | 2118
+
0
-

Nevidím důvod proč by první způsob neměl fungovat. Co je ve vygenerovaném HTML jinak než v druhém případě že se graf nevykreslí?

mr.mac
Člen | 87
+
0
-

Díky za nakopnutí – už blbnu, problém je s escapováním znaků přenášených v proměnné $data.
První způsob data totiž „zkomolí“ – umístí je navíc do uvozovek, druhý je předá správně:

//1. způsob
series: "[{name: 'Zisk', data: [9.0]}, {name: 'Spr\u00e1vn\u00ed re\u017eie', data: [21.5] ...]"

//2. způsob
series: [{name: 'Zisk', data: [9.0]}, {name: 'Správní režie', data: [21.5] ...]

Tak jsem escapování vypnul a je to:

/*graph.latte*/
<script type="text/javascript">
$(function () {
        var data = {!$data},
...
enumag
Člen | 2118
+
0
-

Není zač. Jen si dovolím poznamenat že pokud používáš Nette 2.0.11 nebo novější, doporučuje se použít {$data|noescape}.

Proč druhý způsob fungoval: kvůli tomu jak jsi to includoval Latte nevědělo že se pohybuje v kontextu JS a použilo escapování pro HTML. Když ví že je v kontextu JS tak z čehokoli udělá javascriptový string (tedy zavře do uvozovek a escapuje co je třeba), když tam máš JSON musíš escapování vypnout.

Ale mohl by nastat ještě jeden problém – JSON není podmnožina JS takže by to mohlo selhat. Možná by tedy bylo lepší tam nechat ten string a JSON dekódovat až v prohlížeči.

mr.mac
Člen | 87
+
0
-

Zatím stále váznu na Nette 2.0b i když už na „přechodu“ na 2.0 stable pracuji. Zatím mne ale tlačí hodně práce na „jinak funkčním“ projektu, takže až bude chvíle tak to tam překlopím. Dekódovaní JSONu v prohlížeči je pro mě zatím neprobádané záležitost – je na to nějaký jQuery (nebo jiný) standardní postup?

enumag
Člen | 2118
+
0
-

Ano, dokonce nativní. Pro starší prohlížeče jako IE7 (viz tabulka kompatibility dole) bys musel najít nějakou knihovnu, ale to není problém.

mr.mac
Člen | 87
+
0
-

Díky, mrknu se na to – další inspirace.