Zachování proměnných v komponentě při AJAX požadavku
- roman.campula
- Člen | 60
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:
- z presenteru pomocí továrničky vytvořím komponentu
- z presenteru naplním komponentu daty pomocí její metody setData()
- 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
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)