AJAX – skrytie a odoslanie requestu

- Peppy
 - Člen | 137
 
Mám riadok v tabuľke. Mám v ňom odkaz, po kliknutí na ten odkaz by sa mali vykonať 3 veci:
- Potvrdiť akciu (window.confirm)
 - Poslať HTTP POST request na handler v presenteri.
 - Skryť daný riadok.
 
Robím to v jQuery (takže je k tomu aj jQuery.Nette). Ide o to, ako naformulovať ten odkaz tak, aby to robilo všetky veci. Navyše sa musia posielať POSTom dáta, špeciálne pre ten riadok. Ukážka kódu:
{foreach $infos as $info}
   <tr>
       <td class="col1"> <a href="info/view/info-{$info['id']}">{$info['name']}</a> </td>
       <td class="col2">{$info['expiredate']}</td>
       <td class="col3">
	   <a href="info/edit/info-{$info['id']}">Editovať</a>  
	   <a n:href="">Hotové</a>   <!-- <-- TU -->
	   <a href="info/remove/info-{$info['id']}">Odstrániť</a>
       </td>
   </tr>
{/foreach}
To isté by som chcel dosiahnuť aj pri akcii „remove“. Nie je na to
nejaký obrázok, kto čo koho kedy ako volá? (Zišlo by sa to.) Ide tiež
o to, že neviem ako predať to {$info['id']} JavaScriptu.
// EDIT:
To id asi šupnem na rodiča – na riadok tabuľky.
Editoval Peppy (11. 8. 2011 14:37)

- Mikulas Dite
 - Člen | 756
 
Tak Nette to v pohodě umí, ale spíš je to JS záležitost.
{foreach $infos as $info}
   <tr data-id="$info['id']">
       <td class="col1"> <a href="info/view/info-{$info['id']}">{$info['name']}</a> </td>
       <td class="col2">{$info['expiredate']}</td>
       <td class="col3">
           <a href="info/edit/info-{$info['id']}">Editovať</a>  
           <a n:href="">Hotové</a>   <!-- <-- TU -->
           <a href="info/remove/info-{$info['id']}">Odstrániť</a>
       </td>
   </tr>
{/foreach}
$("a.ajax[href*='/edit/']").live("click", function (event) {
    event.preventDefault();
    var id = $(this).parent('tr').data('id');
    // before edit event
    $.get(this.href, function (payload) {
        $.nette.success(payload);
        // after edit event
    }
});
$("a.ajax[href*='/remove/']").live("click", function (event) {
    event.preventDefault();
    var id = $(this).parent('tr').data('id');
    // before remove event
    $.get(this.href, function (payload) {
        $.nette.success(payload);
        // after remove event
    }
});
});
					Editoval Mikulas Dite (11. 8. 2011 19:07)

- Peppy
 - Člen | 137
 
Z doc.nette.org: MVC ap & presentery ale nikdy sa nepíše o interakcii medzi Client-Side a Server-side…

- Darkry
 - Člen | 101
 
tak si to ověř pomocí javascriptu to neni těžký
onClick="return confirm('...','')"
A proč to chceš poslat postem? Neni lepší pomocí makra
{link} volat handle a předat mu parametr? A pokud chceš pak
skrýt smazaný řádek nebo aktualizovat ten upravený tak to dej do snippetu,
kterej pak invaliduješ (v tom handlu)

- Mikulas Dite
 - Člen | 756
 
@Darkry: přes snippet by to šlo. Ale rozhodně ne pomocí
onClick, raději dynamicky přes ty jquery selectory
$("a.ajax[href='/remove/']").live("click", function (event) {});.

- Peppy
 - Člen | 137
 
@Darky: Cez snippet to nejde.
Jediný možný zápis:
{snippet tabulka} <!-- Potom snippet obsahuje celú tabuľku, to znamená, že celá tabuľka sa musí prekresliť -->
  {foreach $u_todos as $todo}
   <tr id="note-{$todo['id']}">
	<td class="col1"> <a href="note/view/note-{$todo['id']}">{$todo['name']}</a> </td>
	<td class="col2">{$todo['expiredate']}</td>
	<td class="col3">
	   <a href="note/edit/note-{$todo['id']}">Editovať</a>  
	   <a href="#done-todo">Hotové</a>  
	   <a href="#remove-todo">Odstrániť</a>
       </td>
   </tr>
   {/foreach}
{/snippet}
				
- Peppy
 - Člen | 137
 
Á, už to ide. Už tomu chápem. Stačí len praktizovať. No, Nette ma čím ďalej, tým viac fascinuje…zaslúži si darček…aký? nechajte sa prekvapiť.
// EDIT: jQuery:
<script>
	$("a[href*='?do=Done']").live("click", function(event){
	    event.preventDefault();
	    var id = $(this).parent().parent().attr('id');
	    var $row = $(this).parent().parent();
	    $.get(this.href, { nid: id}, function() { $row.hide(400); });
	    return false;
	});
	$("a[href*='?do=Remove']").live("click", function(event){
	    event.preventDefault();
	    var $row = $(this).parent().parent();
	    var id = $(this).parent().parent().attr('id');
	    $.get(this.href, { nid: id}, function(){ $row.hide(400); });
	    return false;
	});
</script>
					Editoval Peppy (11. 8. 2011 19:27)