Předání dat handleru v komponentě – nic se nepředá

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

V komponentě mám formulář. Při změně textového pole Address chci provést operace na pozadí a výsledek vložit jako hodnotu do skrytého pole Result.

Používám následující kód, který mi fungoval na presenteru nicméně při použití v komponentě selhává…

<script>
{* aForm.latte *}
{block content}
	{form aForm}
		{input address}
		{input submit}
	{/form}
{/block}

    {define #jsCallback}
		jQuery('#{$control["aForm"][$input]->htmlId}').on('change', function() {
		    console.log(jQuery(this).val());
		    jQuery.nette.ajax({
		        type: 'POST',
		        url: '{link {$link}!}',
		        data: {
					'value': jQuery(this).val()
		        },
		        success: function(response) { console.log(response) }
		    });
		});
	{/define}

	{block inlineScr}
	    <script type="text/javascript">
	    {include #jsCallback, input => address, link => changeAddress}
	    </script>
	{/block}
</script>
<?php
public function handleChangeAddress($value) {
	$this->presenter->payload->val = $value;
	if ($value) {
		$model = $this->presenter->context->service;
		$this['searchForm']->setDefaults(array('result' => (string)$model->foo()));
		/* ... dadada ... další kód */
	}
	if ($this->presenter->isAjax()) {
		$this->invalidateControl();
	}
	else {
		$this->redirect('this');
	}
}
?>

Operace se provede, správná data jsou dostupná v $_POST
Problém mám s tím, že $value je vždy NULL
Co dělám špatně? Respektive, prosím někoho zkušenějšího, aby poradil, co mi uniká. Děkuji

//Když přistoupím k datům přes $_POST, metoda proběhne korektně, avšak výsledek se nijak neprojeví – nedojde k invalidaci snippetu.

Editoval IlCommendatore (15. 1. 2014 10:08)

duskohu
Člen | 778
+
0
-
  • V priklade nieje nikde snippet, je to len chyba prikladu?
  • Co mas vo firebugu? je tam ten snippet?
IlCommendatore
Člen | 8
+
0
-

Firebug response vrací pouze status[]
a snippet jsem si udělal v šabloně presenteru který to volá, takto:

<script>
{snippet addressFrm}
<div class='div'>{control aForm}</div>
{/snippet}
</script>

EDIT
Snippet jsem přidal to komponenty a Eureka, výsledek je na světě, bohužel ale pořád musím brát $value z POSTu, jelikož ta proměnná je pořád null.

Editoval IlCommendatore (15. 1. 2014 11:36)

duskohu
Člen | 778
+
0
-

Predpokladam ze sa invaliduje len snippet v komponente ktory tam nemas, ten mas v presenteru, takze skus:

if ($this->presenter->isAjax()) {
        $this->presenter->invalidateControl();
    }

ak to pojde tak aby si nemusel z komponenty invalidovat presenter, tak urob toto:

1. Vytvor si udalost v komponente

/** @var array */
public $onChangeAddress;

2. Pri volani signalu si tuto udalost zavolaj

public function handleChangeAddress($value) {
    $this->presenter->payload->val = $value;
    if ($value) {
        $model = $this->presenter->context->service;
        $this['searchForm']->setDefaults(array('result' => (string)$model->foo()));
        /* ... dadada ... další kód */
    }

	$this->onChangeAddress($this);
}

3. V presentri v create component si na tuto udalost naviazes toto:

protected function createComponentAForm()
{
	$that = $this;

	$component = // zavolas komponentu
	// pridas udalost
	$component->onChangeAddress[] = function ($form) use ($that) {
		if ($that->isAjax()) {
			$that->invalidateControl();
			// alebo ked chces invalidovat len tento snippet
			// $that->invalidateControl('addressFrm');
		}else {
			$that->redirect('this');
		}
	};
}
Patrik Votoček
Člen | 2221
+
0
-

nemáš náhodou přetížený konstruktor? a voláš v něm parent::__construct()?

Majkl578
Moderator | 1364
+
+1
-

Máš blbě název parametru (v JS). Není to value, ale nazevkomponenty-value.

nemáš náhodou přetížený konstruktor? a voláš v něm parent::__construct()?

To je už rok irelevantní, od verze 2.0.7.