volání funkce komponenty z javascriptu
- mpis
- Člen | 65
Mám vedle sebe dva elementy: select id=‚count‘ a button
id=‚perPage‘.
V selectu je počet řádků na stránku a tlačítkem se zavolá handle
Perpage.
Toto funguje jak má.
Ale chci to udělat pomocí javascriptu tak, aby se handle PerPage provedl při
změně selectu.
V souboru s javascriptem mám toto:
var change_per_page = function()
{
alert($("#frmform-count").val()+'xxx');
$.nette.ajax({
type: 'GET',
url: {link: 'perPage2!'},
data: {value: $("#frmform-count").val()},
});
};
var begin_setting = function()
{
$("#frmform-count").change(change_per_page);
}
$(document).ready(begin_setting);
Handle PerPage pro button jsem jen přidal a přepsal na PerPage2 kvůli
předání parametru.
Stále nemůžu docílit toho, aby se handle PerPage2 zavolal a provedl.
Problém je stále v řádku
url: {link: 'perPage2!'},
Věděl by někdo, kde dělám chybu?
Editoval mpis (9. 9. 2014 11:08)
- David Matějka
- Moderator | 6445
V souboru s javascriptem mám toto:
jako v externim? musi to byt v latte, jinak se to makro neprelozi…
- Felix
- Nette Core | 1247
mpis napsal(a):
Díky, jdu to hned zkusit.
A to nejde přepsat tak, aby to fungovalo z externího js souboru?
Všude se píše nepoužívat js přímo v html.
To by jsi to musel nejak slozite sam kompilovat. Ja na tohle vetsinou pouzivam data atributy.
// mojeKomponenta.latte
<div data-handle="{link update!}">
.....
</div>
- akadlec
- Člen | 1326
No chybí ti začátečnické informace…
To co se pokoušíš je mixování latte syntaxe a JS syntaxe. V externím JS to fakt neuděláš (né jednoduše) protože ti na ten soubor latte parser nešáhne. Ano všude se píše že to máš oddělit a tak i tomu musíš vše přizpůsobit.
Ty potřebujše vygenerovat link:
{link perPage2!}
Takže pak ten kód musíš mít v latte aby ti šel tak jak ho máš:
$(document).ready(function($){
$("#frmform-count").change(function(){
// Tvuj test....
alert($("#frmform-count").val()+'xxx');
$.nette.ajax({
type: 'GET',
url: {link perPage2!},
data: {
value: $("#frmform-count").val()
},
});
});
});
Editoval akadlec (9. 9. 2014 14:34)
- mpis
- Člen | 65
akadlec:
Díky za vysvětlení. Už mi trochu začíná svítat.
Aplikaci mám v Nette a chtěl bych ji trochu obohatit o js vymoženosti.
Ale ovládnout js není jen tak „Hop na krávu a hned je tele“
Ten script mi funguje, testovací alert funguje, ale handle perPage2 se
nevykoná.
generuje to chybu:
url: „error: Unknown signal ‚perPage2‘, missing handler
HomepagePresenter::handleperPage2()“,
Problém je, že ten handler není v HomepagePresenteru ale v komponentě,
kterou v latte používám.
Jak mám potom ten handler volat ve scriptu?
V latte mám toto:
{block content}
{if $can('PROTOCOL_WRITE', 'PROTOCOL_READ' )}
<h1>Databáze dokumentů radiační ochrany</h1>
<h2>Seznam dokumentů</h2>
{control protocolGrid}
{/if}
<script>
$(document).ready(function($){
$("#frmform-count").change(function(){
alert($(this).val()+'xxx');
$.nette.ajax({
type: 'GET',
url: {link perPage2!},
data: {
value: $(this).val()
},
});
});
});
</script>
{/block}\--
- Felix
- Nette Core | 1247
Stale doporucuju pouzivat data atributy.
Ve formulari si nastav data-url s odkazem. A pak muzes mit externi javascript.
$(document).ready(function($){
$("#frmform-count").change(function(){
alert($(this).val()+'xxx');
$.nette.ajax({
type: 'GET',
url: $(this).data('url'),
data: {
value: $(this).val()
},
});
});
});
- MartinitCZ
- Člen | 580
Tak jako máš atribut href u elementu a (odkazu), tak tak si v elementu formuláře uděláš atribut data-url a vněm si vytvoříš ten odkaz.
- akadlec
- Člen | 1326
@mpis tak to je jasné, odkazuješ se na handle komponenty v šabloně presenteru. Máš dvě možnosti buď ten JS kód hodíš do šablony komponenty a nebo link upravíš tak aby to odkazovalo až na tu komponentu:
{link jmenoTveKomponenty-perPage2!}
A nebo tedy jak již tady bylo zmíněno pomocí data atributu:
$form->addText('count', 'Stránkovadlo ?')
->addAttributes(array(
'data-url' => $this->link('perPage2!')
));
- mpis
- Člen | 65
Díky @akadlec a @Felix.
Po celovečerním zkoušení mi to funguje. Jde to jak přes odkaz tak i přes
data-url.
Zůstávají ovšem dva problémy:
- do handle se mi nepředává hodnota parametru value
- po první změně selectu se vše provede jak má, ale při druhé a další změně selectu nefunguje js
- Jiří Nápravník
- Člen | 710
ad 2) udeleje ten javascript jako nette ajax extension, vice zde a to co mas v document.ready dej do load eventu
- mpis
- Člen | 65
Ještě se zkouším vrátit s prosbou o pomoc.
Všechno mi už funguje kromě správného předání parametru do handle.
Toto funguje:
<script>
$(document).ready(function($){
$("#frmform-count").change(function(){
alert($(this).val()+'\n'+$(this).data('url'));
var selval = $(this).val();
$.nette.ajax({
type: 'GET',
// url: $(this).data('url'),
url: {link perPage2!, 10},
data: {
value: $(this).val()
}
});
});
});
</script>
Toto vygeneruje správný link:
„http://localhost/sep/www/?protocolGrid-value=30&date=2014–10–10&do=protocolGrid-perPage2&presenter=Homepage&value=10“
Jenže já tam potřebuji dostat ten parametr z proměnné selval (namísto
10), a to se mi stále nedaří.
To, co je ve value, je posíláno na jiný presenter, než potřebuji, takže
odtud handle protocolGrid-perPage2 nedostane hodnotu.