Payload obsahuje 2 snippety i když volám redrawControl jen nad jednou

miho
Člen | 13
+
0
-

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)

David Matějka
Moderator | 6445
+
0
-

neprovádíš ten redraw třeba v render metodě?

miho
Člen | 13
+
0
-

V handle metodě presenteru.

David Matějka
Moderator | 6445
+
0
-

Myslel jsem toho itemList.

miho
Člen | 13
+
0
-

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
+
0
-

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
+
0
-

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');
        }
}