AJAXový požadavek: server nezinvaliduje žádný snippet

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

Ahoj,
kliknu na odkaz, pošle se AJAXový požadavek na server. Na serveru se nezinvaliduje žádný snippet. → server vyrenderuje celou stránku. Myslím, že by při jakémkoli AJAXovém požadavku měl server odeslat na klienta očekávanou odpověd, tedy JSON. Tato chyba se vyskytuje už někdy od verze 0.9.1/2, nevím přesně. Ale vím, že to s nějakou verzí 0.9.x kdysi nedělalo. Jako dočasný fix se dá použít tato oprava: (v basepresenteru)

$this->invalidateComponent("nejakySnippetCoVubecNeexistuje");

Ukázka:
http://projekty.mujserver.net/…cument_root/ (live)
http://projekty.mujserver.net/…NetteBug.zip (zdrojáky: upravené oproti skeletonu: @layout, Homepage/default, HomepagePresenter, js/*)

Díky moc,
Honza Kuchař

Editoval honzakuchar (25. 4. 2010 16:13)

Honza Kuchař
Člen | 1662
+
0
-

Oživení: bug nebo feature?

Honza Kuchař
Člen | 1662
+
0
-

Oživení 2: Bug nebo feature?

despiq
Člen | 320
+
0
-

ja sem pro to ze je to feature

phx
Člen | 651
+
0
-

Je to bug!

phx
Člen | 651
+
0
-

Tak jsem se pustil kapku do ladeni a MOZNA tusim kde je problem. Ale asi to je prace pro Davida, protoze nevim zda na neco nezapominam!

Cele to je v Presenter.php

V casi zda je pozadavek AJAX (radek okolo 200) se resi podminky:

  1. je vysledek Render AND (je nejaky snipped invalidovan NEBO existuje payLoad)
  2. neni Render odpoved AND je payLoad

ale neresei se zde kdyz neni ani jedno!!! To je ten problem.

Muzes na to Davide kouknout? Jako reseni se mi jevi z b) udelat jen else cast, ale opravdu mi chyby sirsi pohled. Urcite tam bude nejaky hacek:)

Honza Kuchař
Člen | 1662
+
0
-

Myslím, že je tak jak píšeš. Už jsem to taky jednou zkoumal a došel jsem na to samé místo. Tzn. cesta tudy nejspíš povede.

David Grudl
Nette Core | 8218
+
0
-

Je to „feature“. Pokud neřeknu, co se má kreslit (přes invalidateControl) nebo nepošlu něco do payload, tak se odešle celá stránka. Zabránit se tomu dá tím, že buď uložím nějaká data do payload nebo zavolám přímo sendPayload().