Ajax by jQuery – nefunguje tak jak v návodu

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

Dobrý den,

podle tohoto návodu zde se snažím zprovoznit ajaxové requesty atp…

Toto je problém:

$form['lokalita']->getControlPrototype()
                ->onchange('loadBox(1, this.value);');

v události onchange mi jQueryjový $.get ne a ne fungovat. Strávil jsem s tím celý den, a na oficiálním fóru jQuery mi řekli, že se to nesmí dělat v onchange elementu, ale na stránce pomocí

$(":button").click(function() {
      loadBox();
});

Tak kde je pravda? :D Mě osobně by se onchange hodilo daleko víc, proč to nefunguje?

Děkuji za info,
Tom

newPOPE
Člen | 648
+
0
-
$(":button").click(function() {
      loadBox();
});

Ja by som to skor riesil takto:

<script>

$(":select[name=nazovSelectu]").change(function(){
	$.get({link mojHandle!}, {lokalita: $(this).val()}, function(payload){
		//tu urobim s odpovedou zo servera co potrebujem
	})
});

</script>

Editoval newPOPE (11. 7. 2010 10:36)

tomaass
Člen | 74
+
0
-

No to sice ano, ale jak to udělat, aby to šlo na onchenge toho elementu? Mě jde o ten zápis.

toka
Člen | 253
+
0
-

Takto by to mělo fungovat – „vytahal“ jsem části kódu:

	...
	$form->addSelect('target', 'Typ odkazu:', $types)
	     ->getControlPrototype()->onchange('loadItemTargets(this.value);');
	...
	function loadItemTargets(value) {
		jQuery.get("{link loadData! }", {"value": value}, function(data) {
			jQuery('#frmformAddItem-target').replaceWith(data);
		}, "html");

	}
	public function handleLoadData($value) {
		$form = $this->getComponent('formAddItem');
		$data = $this->model->getAllTargetsByType($value);
		$form['target']->setItems($data);
		echo $form['target']->getControl();
		$this->terminate();
	}

Akorát, má zkušenost, se pak nedá přistoupit k tomuto prvku přes $form->getValues();. Je třeba postupovat např. takto:

	$form->getValues();
	$postValues = $this->presenter->getRequest()->getPost();
$formValues['target'] = $postValues['target'];
tomaass
Člen | 74
+
0
-

Uff. vypadá to komplikovaněji než sem myslel. Ale děkuji. Zakomplikuju to do toho svého :D

toka
Člen | 253
+
0
-

Není to komplikované :-) Na formulářový prvek target zavěsíš JS loadItemTargets(), které volá handle loadData(). A v obsluze odeslání formuláře je akorát navíc ten POST :-D

Editoval toka (11. 7. 2010 12:05)

tomaass
Člen | 74
+
0
-

Clovece, to je genialni :) palec nahoru.

tomaass
Člen | 74
+
0
-

Bohužel to nefunguje.

Prostě a jednoduše, když se na onchange zavěsí volání funkce, tak v tý funkci nejde jQueryjový get..

pro zjednodušení:

<?php
$form['type']->getControlPrototype()
              ->OnChange('loadItemTargets(this.value);');
?>
<script>
function loadItemTargets(value) {
    jQuery.get("{link loadData! }", {"value": value}, function(data) {
            // jQuery('#frmformAddItem-target').replaceWith('asdasda');
	       	alert('baa');
    }, "html");
}
</script>
<?php
	public function handleLoadData($value)
	{
		echo 'asdasD';
	        $this->terminate();
	}
?>

Editoval tomaass (11. 7. 2010 12:19)

toka
Člen | 253
+
0
-

tomaass napsal(a):

Bohužel to nefunguje.

Prostě a jednoduše, když se na onchange zavěsí volání funkce, tak v tý funkci nejde jQueryjový get..

To není možné. Když mi to pošleš, resp. vložíš sem, tak se na to podívám.

tomaass
Člen | 74
+
0
-

ten alert(‚baa‘); se nikdy neprovede.

toka
Člen | 253
+
0
-

A co Firebug ve FF? A není náhodou onchange namísto OnChange? Kdybys to poslal celé, tak bych na to koukl.

Editoval toka (11. 7. 2010 12:41)

tomaass
Člen | 74
+
0
-

to jsem zkousel taky. Nema to vliv. Funkce loadněco se zavolá, ale get ne. Respektive, jak je napsano v manualu: Kdyz se funkce get provede uspesne, tak se zavola obsluzny callback. Coz v tomto pripade se nezavola ⇒ get neprobehne uspesne.

Firebug ani podobny udelatka nemam.
Cely kod taky neposlu, je toho vela :D
Toto musi stacit. S nicim jinym to nekoliduje nebo tak. Je to da se rict samostatny (co se tyce funkcnosti)

toka
Člen | 253
+
0
-

Aha :-) Bez uvozovek ten link. To je tím neskutečným teplem :-D

function loadItemTargets(value) {
    jQuery.get({link loadData! }, {"value": value}, function(data) {
            // jQuery('#frmformAddItem-target').replaceWith('asdasda');
                alert('baa');
    }, "html");
}

Editoval toka (11. 7. 2010 14:11)

toka
Člen | 253
+
0
-

Fakt doporučuji do Firefoxu ten FireBug ;-)

tomaass
Člen | 74
+
0
-

Ano, FireBug to vyřešil.

Chyba byla: nechápu to; ale nelíbilo se jim, že loadData vrátil echem 'něco';

Aby to prolezlo nějakou JS ochranou, tak se to ještě muselo obalit uvozovkama: echo "'něco'";
:)
A je po problemu. Dekuji

Editoval tomaass (11. 7. 2010 19:53)