Jednoduchá komunikace mezi presenterem a jQuery

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

Zdravím… Mám tabulku a v ní řádek, ze kterého získám hodnotu idnote, tu chci poslat metodě handleShowbody(idnote), která na základě toho argumentu vygeneruje text z databáze a pošle ho prezenteru na vykreslení. Mělo by to být primitivní, ale něco mi asi uniká…

Tady je, jak vypadá js:

$('table#notes tbody tr').click(function(event){
    var idnote = $(this).children('td.grid-cell-idnote').text();
    $.get({link showbody!, 'idnote' => idnote}, function(data){
        $('div#ajaxtext').html(data);
    });
});

Takhle vypadá handleShowbody:

public function handleShowbody($idnote)
{
    return $this->notesTable->get($idnote)->note_body;
}

Jestli mám obalit ten div ajaxtext ve snippetui, invalidovat a jaký použít ajaxSetup nevím… Ale zkoušel jsem všechno možné bez úspěchu… Někdy se mi do toho divu přenese celá stránka, většinou nic… Díky za radu!

Editoval mere.gee (20. 7. 2013 15:01)

Jan Tvrdík
Nette guru | 2595
+
0
-

Pro začátek, tohle je blbost těžkého kalibru. Nemůžeš z PHP (Latte) číst proměnnou idnote definovanou v JS.

$('table#notes tbody tr').click(function(event){
    var idnote = $(this).children('td.grid-cell-idnote').text();
    $.get({link showbody!, 'idnote' => idnote}, function(data){
        $('div#ajaxtext').html(data);
    });
});
mere.gee
Člen | 54
+
0
-

Jan Tvrdík napsal(a):

Pro začátek, tohle je blbost těžkého kalibru. Nemůžeš z PHP (Latte) číst proměnnou idnote definovanou v JS.

$('table#notes tbody tr').click(function(event){
    var idnote = $(this).children('td.grid-cell-idnote').text();
    $.get({link showbody!, 'idnote' => idnote}, function(data){
        $('div#ajaxtext').html(data);
    });
});

Dobrá, a máš nějaký návrh, jak to vyřešit jinak? Může fungovat tohle?

$.get({link showbody!}, idnote).done(function(data){
        $('div#ajaxtext').html(data);
});

Editoval mere.gee (20. 7. 2013 15:24)

vvoody
Člen | 910
+
0
-

Handle metódy neočakávajú žiadne návratové hodnoty. Naštuduj si dokumentáciu

Etch
Člen | 403
+
0
-

Nicméně by měli fungovat, pokud si ty data v handle nacpe do payloadu.

mere.gee
Člen | 54
+
0
-

Etch napsal(a):

Nicméně by měli fungovat, pokud si ty data v handle nacpe do payloadu.

To dělám, a stejně nic.

public function handleShowbody()
        {
            $idnote = $this->getParameter('idnote');
            $this->payload->body = $this->notesTable->get($idnote)->note_body;
            $this->sendPayload();
        }
$('table#notes tbody tr').click(function(){
    var idnote = $(this).children('td.grid-cell-idnote').text();
    var param = {
        idnote: idnote
    };
    $.get({link showbody!}, param, function (payload) {
        $('div#ajaxtext').html(payload.body);
    });
});
mere.gee
Člen | 54
+
0
-

Tohle vypisuje UNDEFINED. URL adresa se nezmění, určitě se nepředává ten idnote. Ale proč?

$('table#notes tbody tr').click(function(){
    var idnote = $(this).children('td.grid-cell-idnote').text();
    $.ajax({
        url: !{link Dashboard:showbody},
        type: 'GET',
        data: { 'idnote' : idnote },
        success: function(payload){
            $('#ajaxtext').html(payload.body);
            alert(payload.body);
        }
     });
});
llook
Člen | 407
+
0
-

Znáš Developer Toolbar? V něm je záložka „network“ a tu když si otevřeš, tak uvidíš, co přesně ti javascript posílá za požadavky a co přesně server posílá zpět.

Takhle těžko říct, kde je chyba.

mere.gee
Člen | 54
+
0
-

llook napsal(a):

Znáš Developer Toolbar? V něm je záložka „network“ a tu když si otevřeš, tak uvidíš, co přesně ti javascript posílá za požadavky a co přesně server posílá zpět.

Takhle těžko říct, kde je chyba.

Firebug ukazuje, že se požadují správné parametry, ale vrací se celá stránka. Možná bych měl dodat, že ta hodnota parametru idnote je ve fb nějak divně formátovaná (odřádkování a spousta mezer)… Tady je screenshot. Tak jsem to ostripoval a pořád nic.

Editoval mere.gee (20. 7. 2013 18:34)

llook
Člen | 407
+
0
-

To vypadá, že vůbec neodkazuješ na signál.

Jestli tohle je s tím kódem ze 7. příspěvku, tak u něj vidím hned dvě chyby na jednom řádku: url: !{link Dashboard:showbody}, Jednak neodkazuješ na signál a jednak to v javascriptu neguješ tím vykřičníkem, takže hodnota „url“ bude false.

mere.gee
Člen | 54
+
0
-

Tak v logu jsem našel zprávu: Call to a member function get() on a non-object – laděnce se nelíbí řádek

$this->payload->body = $this->notesTable->get($idnote)->note_body;

notesTable ale definuji při akci, která předchází této, což je asi problém. Jak zařídím, aby byla notesTable (když použiju to sprosté slovo), alespoň v tomto kontextu, globální? Pomůže jí definovat jako persistentní parametr?

mere.gee
Člen | 54
+
0
-

llook napsal(a):

To vypadá, že vůbec neodkazuješ na signál.

Jestli tohle je s tím kódem ze 7. příspěvku, tak u něj vidím hned dvě chyby na jednom řádku: url: !{link Dashboard:showbody}, Jednak neodkazuješ na signál a jednak to v javascriptu neguješ tím vykřičníkem, takže hodnota „url“ bude false.

To už jsem opravil ;) Odkazuji na akci. Když tam dám handle, tak to křičí Component with name ‚Dashboard‘ does not exist. Je to presenter.

Editoval mere.gee (20. 7. 2013 18:51)

mere.gee
Člen | 54
+
0
-

Už to funguje… Díky :)

llook
Člen | 407
+
0
-

Tak tu notesTable vytvářej v konstruktoru, když ji potřebuješ ve více akcích.