Nezobrazují se Flash messages při použití AJAX

- potty
 - Člen | 13
 
Ahoj,
píši svoji první aplikaci podle quickstartu, všechno funguje až na flash messages, který se při použití AJAXu nezobrazí. Postupoval jsem přesně podle quickstartu, invalidaci mám v BasePresenteru v metodě beforeRender. Bez AJAXu fungují v pohodě.
Editoval potty (1. 3. 2012 18:17)

- potty
 - Člen | 13
 
BasePresenter:
<?php
public function beforeRender()
{
	if ($this->isAjax()) {
		$this->invalidateControl('flashMessages');
	}
}
?>
@layout.latte:
{snippet flashMessages}
	<div n:foreach="$flashes as $flash" class="flash {$flash->type}">{$flash->message}</div>
{/snippet}
Komponenta PlayerList.php
<?php
public function handleParticipate($trainingId, $playerId, $isParticipate)
    {
	...
	$this->flashMessage('Nastavení uloženo.');
	if (!$this->presenter->isAjax()) {
	    $this->presenter->redirect('this');
	} else {
	    $this->invalidateControl();
	}
    }
?>
ajax.js:
<script type="text/javascript">
jQuery.ajaxSetup({
    cache: false,
    dataType: 'json',
    success: function (payload) {
        if (payload.snippets) {
            for (var i in payload.snippets) {
                $('#' + i).html(payload.snippets[i]);
            }
        }
    }
});
// odesílání odkazů
$('a.ajax').live('click', function (event) {
    event.preventDefault();
    $.get(this.href);
});
// odesílání formulářů
$('form.ajax').live('submit', function (event) {
    event.preventDefault();
    $.post(this.action, $(this).serialize());
});
</script>
					Editoval potty (1. 3. 2012 20:51)

- potty
 - Člen | 13
 
Díky za video, podle něj jsem to opravil.
V komponentě místo:
<?php
$this->flashMessage('Nastavení uloženo.');
?>
jsem dal:
<?php
$this->presenter->flashMessage('Nastavení uloženo.');
?>
Ještě k tomu videu (v tomto čase), je použita metoda processChange() a v metodě nad ní je napsáno $this->onChange(); Zkoušel jsem to, ale nic to nedělá. Co přesně tahle metoda znamená? Díky.

- llook
 - Člen | 407
 
Tu metodu má pravděpodobně někde (nejspíš v konstruktoru) zaregistrovanou jako handler události onChange, to se dělá takhle:
$this->onChange[] = callback($this, 'processChange');
Když potom zavoláš $this->onChange(), tak Nette udělá
kouzlo a zavolá postupně všechny callbacky uložené do pole
$this->onChange. Popsané je to zde: https://doc.nette.org/…/smartobject#…