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)