Formular se napoprve ajaxove odesle, pak uz ne

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

Zdravim. Mam formular, ve kterem vyuzivam Replicator a onchange selectu jej ajaxove odesilam. Problem je, ze pri prvni zmene selectu se formular spravne odesle a zpracuje, pri dalsich zmenach uz ne (ve firebugu je jen jeden xhr pozadavek, vypada to, ze prijaty snippet nejak rozbil ajaxove odesilani). Nesetkal jste se s tim nekdo, resp. nevite kde je chyba? Diky za odpovedi

Sablona

<script>
// po načtení stránky
$(function () {
        // odeslání na formulářích
        $(".ajax").change(function () {
	    $(this).closest("form").ajaxSubmit();
	    return false;
        });

});
</script>
<div id="wrapper">


    {snippet objednavkaForm}
	{control objednavkaForm begin}
	{if !$control['objednavkaForm']['polozkyObjednavky']->isSubmittedBy()}
		{control objednavkaForm errors}
	{/if}
	{control objednavkaForm body}
	{control objednavkaForm end}
    {/snippet}

presenter(formular + zpracovani)

protected function createComponentObjednavkaForm($name) {
	$form = new MyForm;

	$presenter = $this;
	$invalidateCallback = function () use ($presenter) {
		    $presenter->invalidateControl('objednavkaForm');
		};

	$drinkySelect = array();

	foreach ($this->drinky as $drink) {
	    $drinkySelect[$drink->getId()] = $drink->getNazev();
	}
	$arr = array();
	for ($i = 1; $i <= 5; $i++) {
	    $arr[$i] = $i;
	}

	$replicator = $form->addDynamic('polozkyObjednavky', function (Container $container) use ($invalidateCallback, $drinkySelect, $arr) {
		    $container->currentGroup = $container->form->addGroup();
		    $container->addSelect('drink', 'Drink', $drinkySelect)
			    ->setAttribute('class', 'ajax');
		    $container->addSelect('objem', 'Objem', \Drink::$objemySelect)
			    ->setAttribute('class', 'ajax');
		    $container->addSelect('mnozstvi', 'Množství', $arr)
			    ->setAttribute('class', 'ajax');
		    $container->addHidden('jednotkovaCena');
		    $container->addText('cena', 'Cena')->setAttribute('class', 'cena');

		    $container->addSubmit('removeAjax', 'Smazat')
			    ->setAttribute('class', 'ajax')
			    ->addRemoveOnClick($invalidateCallback);
		}, 1);


	$replicator->addSubmit('addAjax', 'Přidat položku')
		->setAttribute('class', 'ajax')
		->addCreateOnClick($invalidateCallback);

	$form->addText('vyslednaCena', 'Výsledná cena')->setAttribute('class', 'vyslednaCena');
	$form->addSubmit('sendAjax', 'Odeslat objednávku')
		->onClick[] = callback($this, 'ObjednavkaFormSubmitted');

	$this[$name] = $form;
	$form->action .= '#snippet--objednavkaForm';
	$form->onSuccess[] = callback($this, 'ajaxSubmit');
	return $form;
    }

    public function ajaxSubmit(MyForm $form) {
	if ($this->isAjax()) {
	    $form->setValues(array(), TRUE);
	    $this->invalidateControl('objednavkaForm');
	}
    }
Michal Vyšinský
Člen | 608
+
0
-

Jestli se nepletu, tak to nefunguje kvůli změně DOM. Řešení jsou IMO dvě:
Použít .live(„change“, function(){…}). A nebo dát ten script také do snipettu a invalidovat i jej.

Editoval CherryBoss (28. 1. 2013 14:19)

akadlec
Člen | 1326
+
0
-

@CherryBoss: .live() určitě ne, jedná se o deprecated metodu! Když už tak pomocí .on()