Component is not attached – Nette 2.2.1
- blur
- Člen | 15
Ahoj,
Zkusil jsem v projektu udělat update z Nette 2.1.x na
Nette 2.2.1 ale narazil jsem na problem s připojovnaim
komponenty k presenteru. Pokud komponentě explicitně zadám $parent a $name,
tak se zdá být všechno v pořádku ale jinak končím s chybou
Component ‚xy‘ is not attached to Nette\Application\Presenter. Co
se zmenilo v Nette 2.2, aby to zpusobilo tenhle problem?
- blur
- Člen | 15
Chybu to vyhazuje tady:
http://prntscr.com/3olo8p
Registruje se to takhle:
<?php
public function createComponentElFinder()
{
$dialog = new ElFinderDialog();
$dialog->setHeader('Správa souborů');
$dialog->setParams("multiple");
return $dialog;
}
?>
Konstruktor pretizene je:
<?php
class ElFinderDialog extends BaseDialog
{
public function __construct(IContainer $parent = NULL, $name = NULL)
{
parent::__construct($parent, $name);
$this->template->attrs = [];
}
// tohle je v rodici
protected function attached($presenter)
{
parent::attached($presenter);
$this->template->setTranslator($this->translator);
if (method_exists($this, 'startup')) {
$this->startup();
}
}
?>
Nicmene mi to hlasi stejnou chybu na komponentach resenych i trosku jinak.
EDIT:
No uz mi doslo, kde je problem ale ted co s nim? V konstruktoru v nette
2.2 jeste neni template. Protoze to pouziva predpokladam neco jako
createTemplate z presenteru.
Editoval blur (1. 6. 2014 13:03)
- besanek
- Člen | 128
Dělá to tento řádek,
$this->template->attrs = [];
protože tady vytváříš šablonu. Ovšem nově komponenta si šablonu nevytváří sama, ale získá factory od presenteru, který v tomto případě není ještě v konstruktoru nastaven.
Řešení: přesunout tento řádek do
attached()
a konstruktor můžeš s gentlemanským klidem
smazat.
- blur
- Člen | 15
Je spatne reseni nastavit si vlastni templateFactory? viz. https://api.nette.org/…rol.php.html#…
99% komponent vytvarim tovarnou, ktera dedi od BaseControl.
Kdyzbych ji predal sluzbu TemplateFactory rocne z configu tak by to melo
problem vyresit. Nebo se pletu? Zkusim.