Nekonecne volanie handle ajaxom

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

Caute viete mi poradit? mam komponentu v ktorej potrebujem v sablone nekonecne volat handle ajaxovo az dokym nieje splnena podmienka. Viete mi poradit ako to realizovat?

komponenta

public function handleEmailSend() {
    // nejaka akcia

    if ($this->presenter->ajax) {
        if ($this->presenter->isAjax()) {
            $this->invalidateControl('mailer');
        } else {
            $this->presenter->redirect('this');
        }
    }
}

public function render() {
    $checkEmptyMailier = $this->mailerRepository->checkEmptyMailier(); // vracia TRUE|FALSE
    $this->template->setFile(__DIR__ . '/AjaxMailerControl.latte');
    $this->template->checkEmptyMailier = $checkEmptyMailier;
    $this->template->render();
}

sablona komponenty

{snippet mailer}
  // nieco vykreslujem
  {if $checkEmptyMailier}
    // volaj ajaxovo handle kym $checkEmptyMailier == TRUE
  {/if}
{/snippet}

Editoval duskohu (16. 12. 2012 15:36)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Já bych s nette.ajax.js takový polling implementoval následovně:

$.nette.ext({
	success: function (payload) {
		if (typeof payload.checkEmptyMailier !== 'undefined') {
			this.status = payload.checkEmptyMailier;
		}
	},
	load: function () {
		if (this.status) {
			// make ajax request...
		}
	}
}, {
	status: true
});
$this->payload->checkEmptyMailier = $checkEmptyMailier;

Píšu jen obecně :).

duskohu
Člen | 778
+
0
-

Dakujem velmi pekne, inak $this->payload- mam umiestnit do render komponenty? lebo ak ano tak neviem co robim zle lebo mi vracia:

Cannot read an undeclared property AjaxMailerControl::$payload.

EDIT:
uz viem preco:

$this->presenter->getPayload()->checkEmptyMailier = $checkEmptyMailier;

Editoval duskohu (16. 12. 2012 17:57)

Michal Vyšinský
Člen | 608
+
0
-

V komponentě je to $this->presenter->payload

duskohu
Člen | 778
+
0
-

Uz mam len jeden problem:
Ked si dam v success alert(payload.checkEmptyMailier) tak mi stale vypisuje pri 1 cikle raz a v dalsom cikle 2 krat a tak dalej. Preco? Akoby sa ten payload neprepisoval ale nabaloval.

Edit: lebo som ho mal v snippete.:-)

Editoval duskohu (16. 12. 2012 18:06)

duskohu
Člen | 778
+
0
-

Dakujem za pomoc.

duskohu
Člen | 778
+
0
-

Mam jednu ot. k tomuto kodu, asi mu nerozumiem dobre:

  1. ked sa spusti load alert mi vrati hodnotu true, (defaultne je nastavena)
  2. potom nastane success alert(payload.checkEmptyMailerList) sa nevypise, preco? v render som ho nastavil
  3. vypise sa true v load, kedze sa podmienka v success nevykonala
  4. potom zase success tu uz vypise hodnotu 0
  5. a nasledne v load false kedze uz bola splnena podmienka na zmenu this.status
  6. a nasledne vypise 0.

Preco na zaciatku musi prebehnut jedna iteracia lebo v payload.checkEmptyMailerList nie je hodnota?

v render metode mam:

$this->presenter->payload->checkEmptyMailerList = 0;

sablona

$.nette.ext({
    success: function (payload) {
        alert(payload.checkEmptyMailerList);
        if (typeof payload.checkEmptyMailerList !== 'undefined') {

            if(payload.checkEmptyMailerList <= 0 ){
                this.status = false;
            }else{
                this.status = true;
            }
        }
    },
    load: function () {
        alert(this.status);
        if (this.status) {
            $.nette.ajax({
                url: {link emailSend!}
            });
        }
    }
}, {
    status: true
});

Editoval duskohu (17. 12. 2012 14:33)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Zkus mi to ještě trošku popsat, kdy má kde být jaká hodnota – trochu se v tom aktuálním popisu ztrácím.

duskohu
Člen | 778
+
0
-

Oki tak v render metode v mojej komponente si nastavim checkEmptyMailerList teraz len koli testu som mu dal hodnotu 0 ale inak vracia cislo z modelu.

$this->presenter->payload->checkEmptyMailerList = 0;

a v sablone mam

$.nette.ext({
    success: function (payload) {
        alert(payload.checkEmptyMailerList);
        if (typeof payload.checkEmptyMailerList !== 'undefined') {

            if(payload.checkEmptyMailerList <= 0 ){
                this.status = false;
            }else{
                this.status = true;
            }
        }
    },
    load: function () {
        alert(this.status);
        if (this.status) {
            $.nette.ajax({
                url: {link emailSend!}
            });
        }
    }
}, {
    status: true
});

a toto mi stale dookola vracia [true,true,undefined], >>toto sa uz len opakuje [true,undefined] [true,undefined]…
true vypise v load a undefined v success, ten payload.checkEmptyMailerList sa v render metode asi nenastavi a pri prvom success neprejde cez podmienku „undefined“ tym padom nemozem zmenit stav na this.status= false.
Alebo to ma tak fungovat? ze pri prvom success payload este neexistuje?

Editoval duskohu (17. 12. 2012 15:35)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Hm, ty nastavuješ tu proměnnou do payloadu v render metodě, hej? Nicméně ajaxový požadavek děláš na co? Na nějakou handle metodu?

duskohu
Člen | 778
+
0
-

ano na nejaky handle, ten handle je tiez v komponente kde mam render.

public function handleEmailSend() {
    // nejaka akcia

    if ($this->presenter->ajax) {
        if ($this->presenter->isAjax()) {
            $this->invalidateControl('mailer');
        } else {
            $this->presenter->redirect('this');
        }
    }
}


public function render() {
    $this->template->setFile(__DIR__ . '/AjaxMailerControl.latte');
    $checkEmptyMailerList = 0; // tu sa pripojim na model a zistim aktualne cislo
    $this->presenter->payload->checkEmptyMailerList = $checkEmptyMailerList;
    $this->template->render();
}

Editoval duskohu (17. 12. 2012 15:37)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Hm… obalil bych to nastaveni paylodu podmínkou $this->presenter->isAjax() a v té samé podmínce hned potom provedl sendPayload().

duskohu
Člen | 778
+
0
-

oki teraz mi to vracia >> true, true, 0, false, 0

  1. prve truje je normalne lebo je defaultne nesatvene to urobi v load
  2. potom success >> malo by si zistit hodnotu z payload.checkEmptyMailerList ze je 0 hodnota a na zaklade nej nastavit this.status = false, ale miesto toho vypise true, takze v ten alert v success sa ani nespusti, miesto toho vypise true v load
  3. potom vypise 0 success to uz naslo payload.checkEmptyMailerList a nastavi this.status = false
  4. vypise v load false to je tiez dobre
  5. a nasledne v success 0 to je taktiez dobre

Problem je v tom ze 1 iteracia prebehne lebo na zaciatku nenaslo payload.checkEmptyMailerList

public function render() {
    $this->template->setFile(__DIR__ . '/AjaxMailerControl.latte');
    $checkEmptyMailerList = 0;
    if($this->presenter->isAjax()){
        $this->presenter->payload->checkEmptyMailerList = $checkEmptyMailerList;
        $this->presenter->sendPayload();
    }
    $this->template->render();
}
duskohu
Člen | 778
+
0
-

Chcel by som sa spytat ako by sa dal tento priklad riesit zapomocoi Dynamickych snippetov v komponente ako je to tu: https://doc.nette.org/…mic-snippets, teraz mam tu extenzi v komponente, ale ked mam viac komponent tak bude aj kod extenze viackrat na stranke. Takze ho presuniem do head v sablone, ale tym padom neviem ako si posielat linku na handle. Tiez to mam robit cez $this->presenter->payload ?

Editoval duskohu (18. 12. 2012 13:42)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Jakékoliv extenze pro nette.ajax.js bys měl mít ideálně v externím javascriptovém souboru, ne napláclé v šabloně a ještě k tomu vypisované v cyklu :).

Ad posílaná adresa… uvědom si, že payload je soubor dat, který se ti vrátí při ajaxovém požadavku. Ale při načtení stránky se žádný požadavek neprovádí, tudíž žádný payload ještě logicky nikde nepřišel. Data (ten link na signál) si hoď třeba do datového atributu na <body> nebo něco podobného, a v load callbacku si ho načti.