Invalidace komponenty a znovunačtení dat

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

Zdravím, možná někdo z vás na tento problém už narazil, popravdě já jsem na něj párkrát narazil, ale vždy jsem ho nějak vyřešil, ale teď je to trochu jiná situace.

Jedná se o to, že pracuji s daty přes rest api a následně vykreslím formulář. Popíšu jednotlivé kroky jak to zhruba funguje:

  1. request na server, který vrátí jak má formulář vypadat
  2. předám response do jakéhosi FormParser modelu, který vytvoří formulář a vrátí ho
  3. předám form do komponenty drawForm a komponentu vykreslím v šabloně.

Vše je fajn až do doby, kdy potřebuji mít formulář trochu dynamický, například uvnitř komponenty drawForm mám handleRemove($id), která zavolá opět nějaký request a smaže data na serveru.

Už asi tušíte kde je můj problém, logicky když zavolám handleRemove() tak se nejprve zavolá request, který načte data a až poté se zavolá request pro remove. Takže problém je v tom, že ikdyž poté komponentu invaliduju, tak obsahuje data včetně těch smazaných. Napadlo mě třeba přes js zavolat prázdný ajax, který znovu invaliduje komponentu, ale to je opravdu až to krajní řešení. Zkrátka bych potřeboval nějak v handleRemove() říct „vše načti znovu“.

Jak tento problém správně řešit ? Moc díky za nápady.

A teď druhý dotaz:

když jsem například zanořený v několika komponentách {komponenta-komponenta2-komponenta3} a potřebuji invalidovat nějaký snippet na presenteru, tak samozřejmě by asi šlo $this->parent->parent->presenter->redrawControl() , ale nešlo by něco obecnejšího ? znovu díky

Editoval kleinpetr (21. 1. 2016 17:03)

Martk
Člen | 656
+
0
-

1: Přesunout request na api do render metody.
2: $this->presenter->redrawControl()

kleinpetr
Člen | 480
+
0
-

Request na api právě volám v createComponent..() v presenteru…

David Matějka
Moderator | 6445
+
0
-

a odkud volas/se vola ta createComponent*? nebo z jakeho duvodu je nutne to volat pred zpracovanim signalu?

kleinpetr
Člen | 480
+
0
-

Rozepíšu postup trochu blíže (pouze rychlý nástřel)

TestPresenter extends Presenter
{
	inject $formParserModel
	inject $drawFormControl

	createComponentForm()
	{
		$form = $formParserModel->getForm('url/to/api');
		$control = $drawFormControl->drawForm($form);
		return $control;
	}
}

Komponenta drawForm

DrawFormControl extends Control
{
	public function handleRemoveElement($id){
		//request na delete nejakeho prvku
		$this->presenter->redrawControl();
	}
}

A potřeboval bych nějak v renderMetode rict aby nacetl komponentu znovu, kdyz pridam komponentu rucne v renderMetode jako $this->addComponent() a pak zavolam signal tak mi hodi BadSignalException

Editoval kleinpetr (21. 1. 2016 22:59)