AJAX – zpracování formuláře přestane po pár odeslání fungovat

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

Zdravím,

občas se mi stane, že se nedokáže správně zpracovat formulář. Např. 4× za sebou se hodnoty odešlou správně a pak se to z pro mě neznámého důvodu zasekne a dokud stránku neaktualizuji, tak formulář nelze znovu odeslat.

Vytvoření formuláře:

pomocí atributu data-ajax-function se automaticky zavolá daná funkce.

<?php

/**
 * @return Form
 */
public function createAddRank()
{
	$form = new Form();
	$form->getElementPrototype()->{"data-ajax-function"} = "addRank(this);";
	$form->addText("name", "název");
	$form->addSubmit("add", "přidat");

	$form->onSuccess[] = $this->addRankSubmitted;

	return $form;
}


/**
 * @param Form
 * @param Nette\ArrayHash
 */
public function addRankSubmitted(Form $form, $values)
{
	$p = $form->getPresenter();

	try {
		$this->facade->addRank($values->name);
		$p->flashMessage("OK", "success");

		if ($p->isAjax()) {
			$form->setValues(array(), TRUE);
			$p->payload->error = FALSE;
			$p->payload->name = $values->name;
		} else {
			$p->redirect("this");
		}
	} catch (UniqueConstraintViolationException $e) {
		$form->addError("záznam již existuje");

		if ($p->isAjax()) {
			$p->payload->error = TRUE;
		}
	}

	if ($p->isAjax()) {
		$p->redrawControl("ranks");
		$p->redrawControl("scripts");
	}
}

?>

s JS použvám knihovnu jQuery. Pomocí funkce formValuesToObject() se mi všechny hodnoty z formuláře hodí do objektu (v tomto případě to udělá řetězec jako v URL, zkoušel jsem více možností, ale všechny dopadly stejně).

{snippet scripts}
<script type="text/javascript">

function formValuesToObject(form)
{
	var arr = $(form).serializeArray();

	return decodeURIComponent($.param(arr));
}

function addRank(form)
{
	var f = $(form);

	$.nette.ajax({
		type: f.attr("method"),
		url: f.attr("action"),
		data: formValuesToObject(f)
	}).success(function(result) {
		console.log(result);
	});

	return false;
}
</script>

{/snippet}

Vykreslení formuláře

{snippet ranks}
	{control addRankForm}
{/snippet}

Jen pro ukázku, co vypíše konzole. 4× se formulář odeslal správně a poté jakoby vůbec nedošlo ke zpracování (nevrátily se mi hodnoty error, name a hodnota snippets je prázdná).
Pokaždé byl ten formulář odeslán bez aktualizace stránky, prostě po kliknutí na tlačítko se formulář překreslil a takhle dokola, dokud to nepřestalo fungovat :D

https://ctrlv.cz/G1N4

Nevíte, v čem by mohl být problém?