Jaký je doporučený způsob na include javascriptu?
- mr.mac
- Člen | 87
Ř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)
- mr.mac
- Člen | 87
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
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
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?