Komponenty a AJAX workflow
- Dismember
- Člen | 50
Ahoj,
mám takové dilema ohledně workflow mezi komponentami s ajaxem. Nevím, jestli plyne z nepochopení a nebo to tak prostě funguje.
O co jde:
Mějme profil uživatele, na které jsou jeho produkty.
Pro vykreslení profilu uživatele použiju kompomentnu uživatele UserDetailControl, který příjmá email a nějaké modely
<?php
class UserDetailControl extends Nette\Application\UI\Control {
public function __construct($user_email, Model $model) {
parent::__construct();
$this->user_email = $user_email;
$this->model = $model;
}
public function render() {
// ... mj. api call, který trvá řádově vteřiny
}
}
?>
U uživatele se rovněž vypisují jeho produkty, které se opět získávají přes API a jednotlivé volání trvají vtěřiny. Proto jsem se rozhodl vytvořit produkty tak, že se vypíše jejich konstra (overview, které získám spolu s uživatelem výše) a zbytek detailů dotáhnu po načtení stránky pomocí AJAX.
Ve třídě UserDetailControl jsem tedy vytvořil komponentu, která dostává při své vzniku model (stejn co výše)
<?php
public function createComponentProduct(){
return new \App\Components\ProductControl($this->model);
}
?>
A která se volá v šablone UserDetail.latte kompomentu product a dostává nějaké ID a CONTENT (pro výpis té kostry)
<?php
{control product id => $id, content => $content}
?>
Dále mám tedy třídu ProductControl pro zobrazení produktu a volání detailů handleGetDetail()
<?php
class ProductControl extends Nette\Application\UI\Control {
public function __construct(Model $model) {
parent::__construct();
$this->model = $model;
}
public function render($params = NULL) {
// problém při cestě z AJAXU
}
public function handleGetDetails(){
if ($this->presenter->isAjax()) {
// další API call
// naplnění proměnných obsahem
$this->redrawControl();
}
}
}
?>
Po načtení stránky se provede AJAX call pro získání detailu produktu a zde dochází k něčemu, čemu úplně nerozumím:
- u té první třídy UserDetailControl, která získává email v konstruktoru ten email při provádění ajax chybí a získávám ho pak z url adresy. Provádí se celý render() a opět znovu api call
- a té druhé třídy ProductControl při překreslování po ajax callu se opět provádí render(). Protože jdeme z AJAXu, tak jsme mu ta data už nezvládli podstrčit (a nebo zvládneme?) a musím provádět další API call, abych ten content získal
Těmi API voláními se mi to celé hrozně zdržuje. AJAX volá handleGetDetails, pak se volá render(), tak jak to životní cyklus popisuje…lze se těm voláním podruhé vyhnout? Jak byste to řešili vy?
Díky moc za pomoc
- Dismember
- Člen | 50
Tak jsem částečně na to přišel asi:
- v první třídě UserDetailControl provádím API call pouze když to není ajax a tak po mě znovu nechce ten email. Tímhle jsem ušetřil jeden API call
- v té druhé tříde ProductControl to asi udělám tak, že si při prvním volání uložím data do databáze a při tom druhém průchodu při ajaxu je z databáze načtu. Bude to sice práce s DB ale bude to várazně rychlější než API call
- David Matějka
- Moderator | 6445
u té první třídy UserDetailControl, která získává email v konstruktoru ten email při provádění ajax chybí a získávám ho pak z url adresy.
proc tam chybi? jak ho predavas?
a té druhé třídy ProductControl při překreslování po ajax callu se opět provádí render(). Protože jdeme z AJAXu, tak jsme mu ta data už nezvládli podstrčit
do renderu nikdy nepredavej parametry, funguje to spatne s ajaxem. koukni se na Multiplier, pomoci ktereho vytvoris komponentu pro kazdy produkt
vice o snippetech v me prednasce