invalidateControl()

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

Už jsem na to poukazoval v jednom tématu. Celou věc jsem přesunul do nového projektu, je tam jenom skeleton a defaultPresenter s šablonou. V presenteru mám:

Class DefaultPresenter extends Presenter{

  public $textChange="Původní";


  public function renderDefault(){
    $this->setLayout(FALSE);
    $this->template->textChange=$this->textChange;
    $this->template->textStatic="Původní";

  }

  public function templatePrepareFilters($template){
    $template->registerFilter(new CurlyBracketsFilter);
  }

  public function handleChange(){
    $this->textChange="Změněno";
    $this->invalidateControl("textChange");
  }

}

a v šabloně:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <meta name="generator" content="PSPad editor, www.pspad.com">
  <script src='{$baseUri}js/jquery.js' type="text/javascript"></script>
  <script src='{$baseUri}js/jquery.nette.js' type="text/javascript"></script>
  <title></title>
  </head>
  <body>
  <b>Má se poslat po kliknutí na odkaz:</b>
  {snippet textChange}
  {$textChange}
  {/snippet}

  <b>Nemá se poslat když kliknu na odkaz:</b>
  {snippet textStatic}
  {$textStatic}
  {/snippet}

  <a href='{link change!}' class='ajax'>Změnit</a>
  </body>
</html>

No a v čem je problém? Podle všeho co jsem si o tom přečetl by se po kliknutí měl poslat jenom ten snippet, který byl invalidován. Jenomže když kouknu do FireBugu odesílají se oba:

{"state":[],"snippets":{"snippet--textChange":"  Zm\u011bn\u011bno\r\n","snippet--textStatic":"  P\u016fvodn\u00ed\r\n"}}

A navíc, když zakomentuju invalidateControl(„textChange“) tak se taky pošlou. Něco jsem špatně pochopil, nebo se tady děje něco zvláštního? Díky za odpovědi.

Verze: Nette Framework 0.9.2 (revision b9fd602 released on 2009–11–12)

redhead
Člen | 1313
+
0
-

neštudoval jsem celej kód, ale zkus za invalidateControl() přidat $this->terminate(); (je to jen tip, nevim jinak)

i.magine
Člen | 81
+
0
-

Ahoj, zdá se že když to udělám tak se neodešle vůbec žádná odpověď.

i.magine
Člen | 81
+
0
-

Ja to fakt nechapu :D… zkousel sem to i v jiny aplikaci a u formularu to funguje (spravne to invaliduje) ale u odkazu zase ne.

i.magine
Člen | 81
+
0
-

Tak znovu jsem se začetl do dokumentace a v https://doc.nette.org/…ication/ajax se píše :

Komponenta, která přijímá signál, je automaticky označena za invalidní.

Napřed jsem myslel, že se to týká jenom komponent, ale pak jsem si uvědomil, že párkrát jsem četl, že presenter se také označuje jako „zvláštní komponenta“. To tedy znamená, že když presenter přijme signál tak se úplně celý zinvaliduje a já s tím nic nenadělám? Chci říct, k čemu to je? Vždyť nic mi nebrání zavolat v handleru invalidateControl() tak nevím proč bych neměl být pánem toho co invaliduju.

Příklad z praxe:

Na jedné stránce mám chat a anketu. Chci aby oba jeli nezávisle na sobě, ale když v anketé kliknu na „hlasovat“ zavolá se signál addVote a celý presenter se zinvaliduje. Co s tím?

Díky

Ondřej Mirtes
Člen | 1536
+
0
-

Myslím, že zrovna tohle už neplatí, že zde dokumentace zaspala.

i.magine
Člen | 81
+
0
-

No super… zdá se že máš pravdu, ale pořád je to jenom u nestabilní verze (předtím jsem používal poslední stable). Kdybych to věděl tak by mi to ušetřilo dva dny času.

Díky

P.S: Možná by nebylo od věci to do dokumentace doplnit.

Editoval i.magine (11. 1. 2010 17:15)

i.magine
Člen | 81
+
0
-

Mám další problém, nevím jestli je to bug a jestli jo jestli je potřeba ho vůbec u night-build verze hlásit, ale po nahrání nového nette, smazání tempu a nastavení šablon to hlásí divokou chybu:

Call to undefined method Identity::getName().

i.magine
Člen | 81
+
0
-

Díky, vypadá to jako blbej dotaz, ale vážně jsem to hledal a nic nenašel.