Zachování proměnných v komponentě při AJAX požadavku

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

Zdravím,
snažím se vytvořit jednoduchý datagrid (abych se to trochu naučil – nezajímám se o návrhy na již hotové).
Postupuji takto:

  1. z presenteru pomocí továrničky vytvořím komponentu
  2. z presenteru naplním komponentu daty pomocí její metody setData()
  3. v šabloně zobrazím komponentu

Data se zobrazují správně. Problém je v tom, že jakmile udělám AJAX požadavek do komponenty kvůli seřazení sloupce, data (která jsem tam dříve vložil pomocí setData()) už v komponentě nejsou. Asi se komponenta inicializuje znovu, a proto tam už data nejsou.

Jak zabezpečit, aby tam data zůstala? Přemýšlel jsem o perzistentních parametrech, ale to jsem nakonec zavrhl, protože se předávají v URL a já budu mít dat hodně, např. 1000 řádků a 10 sloupců.

Díky za pomoc.

První zobrazení – data z databáze:

100			Jan Malý
101			Josef Velký

Po kliknutí na <a n:href=„order!“ class=„ajax“>:

1			Výchozí 1
2			Výchozí 2
3			Výchozí 3

Část presenteru:

class TripsPresenter extends \App\AppModule\Presenters\BasePresenter {
...
  function renderDefault() {
    $users = ...
    $dataRows = [];
    foreach ($users as $user) {
      array_push($dataRows, ["userId" => $user->id,
                             "userName" => $user->name." ".$user->surname]);
    }

    $this["tripsDataGridControl"]->setData($dataRows); // nastavení zobrazovaných dat
  }
...
}

Komponenta:

class TripsDataGridControl extends Nette\Application\UI\Control {
  private $data;

  function __construct() {
    parent::__construct();
    $this->data = [["userId" => 1, "userName" => "Výchozí 1"],
                   ["userId" => 2, "userName" => "Výchozí 2"],
                   ["userId" => 3, "userName" => "Výchozí 3"]];
  }

  function setData($data) {
    $this->data = $data;
  }

  function render() {
    $this->template->dataRows = $this->data;
    $this->template->setFile(__DIR__."/templates/default.latte");
    $this->template->render();
  }

  function handleOrder($by) {
    dump($this->data); // zobrazí inicializační hodnoty se jmény "Výchozí <X>" apod.

    $this->redrawControl("tripsDataGrid");
  }
}

interface ITripsDataGridControlFactory {
  /**
   * @return TripsDataGridControl
   */
  function create();
}
David Matějka
Moderator | 6445
+
+2
-

ahoj, viz zivotni cyklus presenteru, ke zpracovani signalu handleOrder dojde pred zpracovanim renderDefault v presenteru. kdyz to presunes do actionDefault, tak to pujde OK (pripadne to muzes presunout do createComponentTripsDataGridControl)