volání funkce komponenty z javascriptu

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

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
+
0
-

V souboru s javascriptem mám toto:

jako v externim? musi to byt v latte, jinak se to makro neprelozi…

mpis
Člen | 65
+
0
-

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.

Editoval mpis (9. 9. 2014 11:21)

Felix
Nette Core | 1247
+
+5
-

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>
mpis
Člen | 65
+
0
-

Tak teď z toho už mám úplný zmatek v hlavě.
Když dám script do latte, tak pořád to samé – neumím napsat správně tem řádek s url.
To Felix:
Mohl bys to, prosím, pro mně coby začátečníka trošku zkonkretizovat na ten můj případ?

akadlec
Člen | 1326
+
+1
-

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
+
0
-

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
+
+3
-

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()
            },
        });
    });
});
mpis
Člen | 65
+
0
-

Felix napsal(a):

Stale doporucuju pouzivat data atributy.

Ve formulari si nastav data-url s odkazem.

Díky za reakci, ale stále nerozumím tomu „Ve formulari si nastav data-url s odkazem.“

Editoval mpis (9. 9. 2014 16:17)

MartinitCZ
Člen | 580
+
0
-

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.

Aurielle
Člen | 1281
+
+1
-

@mpis nastuduj si prosím použití data- atributů v HTML.

mkoubik
Člen | 728
+
0
-

Ještě doporučuju si vygooglit „unobtrusive javascript“.

akadlec
Člen | 1326
+
+1
-

@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
+
0
-

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:

  1. do handle se mi nepředává hodnota parametru value
  2. 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
+
+1
-

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
+
0
-

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.

akadlec
Člen | 1326
+
+1
-

Tak si tu 10ku nepředávej v tom generování linku ale předej si to selval v těch datech no a pak v konkrétním handle si ji vytáhní z GETu.

mpis
Člen | 65
+
0
-

@akadlec
Díky.
Jsem to ale pako, to mně taky mohlo napadnout.
Už to maká jak se patří.