Kdy nastava pripojeni komponenty k presenteru?

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

Ahoj mam dotaz ohledne pripojovani komponent k presenteru. Obcas se mi stava, ze dostavam hlasku v podobe „Component … was not attached to …\Presenter“. Kdy presne se pripojuje komponenta k presenteru a naopak? Napriklad:

// kod v presenteru
// zavola se tovarnicka createComponent<Jmeno_komponenty>

$this['jmeno_komponenty']->metoda(...);

// kod v komponente jmeno_komponenty

public function metoda(...) {
	$presenter = $this->presenter;
}

Zajima me, jestli budu mit pristup k presenteru v pripade, ze se vytvori komponenta a hned se na ni zavola nejaka metoda. Protoze, pokud ne, tak jinak nevim, co muze zpusobovat tu chybu.
Diky za rady.

japlavaren
Člen | 404
+
0
-

ahoj,

  1. komponenta sa vytvara v momente, ked ju zavolas z presenteru $this[kompoennta], alebo sa ma renderovat v sablone {control komponenta}. ak sa nemylim, tak sa vytvara este ked prijma signal – ?do=komponenta-akcia
  2. pri pripajani k rodicovi (presenteru/inej komponente) sa vola metoda attached()
  3. komponenta je definitivne pripojena az v metode render()

Hlasku, component was not attached to presenter, dostavas ak sa snazis pracovat s presenterom (alebo pouzivas link ktory vyuziva presenter), pred metodou render. predpokladam ze mas komponentu v komponente a na nej volas $this->presenter, alebo $this->link.

riesenie tvojho problemu je jednoduche – subkomponentu nadefinuj a vsetky operacie na ktore potrebujes presenter rob az v render metode komponenty

Editoval japlavaren (19. 9. 2014 20:25)

Zax
Člen | 370
+
+2
-

Komponenty se připojí k rodiči po prvním vytvoření, což se děje ve chvíli, kdy o ni nějak požádáš ({control komponenta}, $this['komponenta'], ?do=komponenta-signal apod.).

  1. Když požádáš o komponentu, zavolá se metoda getComponent(‚komponenta‘).
  2. Metoda getComponent se koukne, jestli je komponenta vytvořená, pokud není, tak zavolá createComponent(‚komponenta‘).
  3. Metoda createComponent zavolá továrnu createComponentKomponenta().
  4. Metoda getComponent má tedy novou komponentu, tak se ještě koukne, jestli je připojená a pokud není, tak ji připojí – zavolá addComponent.
  5. Metoda addComponent zavolá setParent na vytvořené komponentě a setParent pak (zjednodušeně) zavolá metodu attached.

Uvnitř továrny (createComponentKomponenta) komponenta obvykle není připojena (ale nic nebrání si ji ručně připojit), ale když si pak vytáhneš instanci někde mimo tu továrnu ($this['komponenta']), tak už ji budeš mít připojenou.

https://api.nette.org/…ner.php.html#140

Editoval Zax (19. 9. 2014 21:41)

Šaman
Člen | 2666
+
0
-

japlavaren napsal(a):

ahoj,

  1. komponenta sa vytvara v momente, ked ju zavolas z presenteru $this[kompoennta], alebo sa ma renderovat v sablone {control komponenta}. ak sa nemylim, tak sa vytvara este ked prijma signal – ?do=komponenta-akcia
  2. pri pripajani k rodicovi (presenteru/inej komponente) sa vola metoda attached()
  3. komponenta je definitivne pripojena az v metode render()

Hlasku, component was not attached to presenter, dostavas ak sa snazis pracovat s presenterom (alebo pouzivas link ktory vyuziva presenter), pred metodou render. predpokladam ze mas komponentu v komponente a na nej volas $this->presenter, alebo $this->link.

riesenie tvojho problemu je jednoduche – subkomponentu nadefinuj a vsetky operacie na ktore potrebujes presenter rob az v render metode komponenty

Není potřeba čekat na render. Když je komponenta je připojená, zavolá se metoda attached(), svůj kód, ke kterému potřebuješ třeba presenter směřuj do této metody. V render už pak samozřejmě je připojená taky.