Payload obsahuje 2 snippety i když volám redrawControl jen nad jednou
- miho
- Člen | 13
Ahoj,
mám v presenteru 2 nezávislé snippety (košík smallCart a seznam produktů v kategorii itemList). Klik na přidej do košíku v seznamu produktů volá
public function handleAddToCart(int $pid) {
//...
$this->redrawControl('smallCart');
}
I když je tam redraw jen jednoho snippetu, tak se v payload posílají oba snippety. Kvůli tomu $.nette.success(payload); překreslí obě věci a blikne to + se na straně serveru renderují a posílají zbytečná data. Obcházím to bliknutí pomocí
delete payload.snippets['snippet--itemList'];
$.nette.success(payload);
ale není to moc elegantní. Jak mám udělat, aby se posílal jen ten snippet, který si vyžádám? Je nutné oba snippety zanořit do komponent?
Editoval miho (22. 3. 2021 12:33)
- miho
- Člen | 13
Tam to skutečně mám kvůli ajaxovému vyhledávání a přepinání kategorii…
public function renderList(int $category=1, string $search='') {
//...
if ($this->isAjax()) {
$this->redrawControl('itemList');
}
}
nějak mě nenapadlo, že se tohle zavolá když se zpracovává ajax signál handleAddToCart. Prosím o nakopnutí správným směrem jak to vyřešit. Ten cart se vykresluje na každé stránce (je v @layoutu) data pro něj připravuje už BasePresenter v beforeRender.
Editoval miho (22. 3. 2021 17:45)
- David Matějka
- Moderator | 6445
musis si ten redraw nejak o-ifovat. napr:
- v tom handle si nekam ulozis do clenske property, ze nechces provadet redraw item listu
- nebo pridas podminku
!$this->getSignal()
coz pak nebude provadet ten redraw, pokud byl zavolan „handle“ - nebo treba pres
!$this->isControlInvalid()
– metoda isControlInvalid vrati true, pokud je nejaky snippet oznacen jako redrawnuty
- miho
- Člen | 13
Ten getSignal mám pocit fungoval, pak jsem někde něco změnil a fungovat přestal. Vrací null i když se zpracovává handle. Takže to mám teď takto ošklivě:
public function renderList(int $id = 1, string $search = '') {
//...
if ($this->isAjax() && $this->getHttpRequest()->getQuery('do')!='addToCart') {
$this->redrawControl('itemList');
}
}