Jak nejlépe reagovat na dokončení akce komponent

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

Narazil sem při psaní jedné aplikace na problém a to jak reagovat(překreslovat snippet) v komponentě na reakci jiné komponenty.

Pro příklad: Máme v presenteru komponentu Galerie, která vypisuje již nahrané fotografie a dále má možnost klasického uploadu (form). Galerie obsahuje i komponentu na nahrávání fotek z Facebooku. Kliknu na FB upload, vyskočí nad výpisem fotek modál, který obsahuje FB fotky. Vyberu fotky a potvrdím, v modálu překreslím snippet s hláškou, že je fotka nahrána.

A teď ten problém. V pozadí modálu je vidět seznam nahraných fotek, ale tím, že jsem přidal další fotografii není seznam aktuální a já ho potřebuji v pozadí překreslit. Jenže upload FB fotek a seznam fotek je v jiné úrovni (Presenter → Galerie (seznam fotek) → FB upload).

Jak docílit(pokud možno čistě) toho aby se seznam fotek(snippet) překreslil na akci komponenty FB upload při dokončení?

Zax
Člen | 370
+
0
-

Stačí si tu komponentu vytáhnout třeba z presenteru a zavolat na ní redrawControl

$this->presenter->getComponent('galerie')->redrawControl()
Pavel Macháň
Člen | 282
+
+1
-

Zax napsal(a):

Stačí si tu komponentu vytáhnout třeba z presenteru a zavolat na ní redrawControl

$this->presenter->getComponent('galerie')->redrawControl()

@Zax Nešlo by to řešit spíš pomocí nějakých eventů? Nepřijde mě moc čístý jít z komponenty do presenteru a zněj zase do jiné komponenty

Editoval Pavel Macháň (20. 9. 2014 13:39)

Zax
Člen | 370
+
+1
-

Eventy samozřejmě použít jdou. Nevím sice, jaké je „nejčistší“ řešení, ale aspoň jako příklad provázání v presenteru:

// upload komponenta
class UploadControl {

    public $onUploaded = [];

	public function uploadFormSubmitted(Form $form) {
		do_something();
		$this->onUploaded();
	}

}
// presenter
class Presenter {

    protected function createComponentUpload() {
        $upload = $this->uploadFactory->create(); // new UploadControl
        $upload->onUploaded[] = function() {
            $this->getComponent('galerie')->redrawControl();
        };
        return $upload;
    }

}
Pavel Macháň
Člen | 282
+
0
-

Zax napsal(a):

Eventy samozřejmě použít jdou. Nevím sice, jaké je „nejčistší“ řešení, ale aspoň jako příklad provázání v presenteru:

// upload komponenta
class UploadControl {

    public $onUploaded = [];

	public function uploadFormSubmitted(Form $form) {
		do_something();
		$this->onUploaded();
	}

}
// presenter
class Presenter {

    protected function createComponentUpload() {
        $upload = $this->uploadFactory->create(); // new UploadControl
        $upload->onUploaded[] = function() {
            $this->getComponent('galerie')->redrawControl();
        };
        return $upload;
    }

}

Tak eventy fungují suprově! Že mě to hned nenapadlo :) Díky za nakopnutí.

Todle řešení je určitě čistější. Protože se do toho nezatahuje vůbec tahání komponent z presenteru

/** @return FacebookPhotos */
public function createComponentFbPhotos() {
    $fbPhotos = $this->facebookPhotosFactory->create($this->campaign);
    $fbPhotos->onSuccess[] = function () {
        $this->redrawControl('photoList');
    };

    return $fbPhotos;
}