signál v komponentě – Neposílají se data do šablony
- zoid
- Člen | 12
Zdravím,
Napsal jsem si komponentu dědící z UI\Control ve které taky zachytávám nějaké signály volané AJAXem. Poté bych potřeboval překreslit snippet v té komponentě, jenže state který se mi posílá je prázdný. Viz
public function handleTransport($transportId) {
$this->basket->setTransport($transportId);
$this->template->basket = $this->basket;
$this->redrawControl("basketItems");
}
response po ajaxovém zavolání vypadá následovně:
{"state":[]}
Komponentu v presenteru vykresluji přes {control basket}, zkoušel jsem ji obalit do {snippetArea} a po zachycení signálu z komponenty překreslit tuto snippet areu, popř. vložit basket do $presenter->template namísto $component->template, ale stále stejný problém, do šablony se mi nic neposílá.
Provizorně to řeším tak, že při zachycení signálu provedu logickou část (setTransport) a nic do šablony neposílám, takže se mi vrátí celá stránka (která už je překreslená správně) a tu nahradím přes JQuery za obsah stávájící, ale přijde mi to dost nešikovné, takže bych rád použil snippety, když už tu jsou – pravděpodobně mi uniká nějaká základní logika těch snippetů v komponentách (články o ajaxu i komponentách v doc už jsem četl), takže budu rád za cokoliv, co mě nějak nasměruje.
Používám Nette 2.3.10
Předem díky, hawk!
- zoid
- Člen | 12
Ořezal jsem nějaké zbytečné html (je celkem velká), tohle by mělo být to podstatné.
<div class="container" n:if="$basket->exists()" n:snippet="basketItems">
<h2>Doprava</h2>
<table>
<tr n:foreach="$transports as $transport">
<td>
<input
type="radio"
name="transport"
value="{$transport->id}"
class="transport"
id="transport-{$transport->id}"
{if $basket->transport == $transport}checked="checked"{/if}
>
</td>
<td>
<label for="transport-{$transport->id}">{$transport->name} </label>
</td>
<td>{$transport->price} Kč</td>
</tr>
</table>
Celková cena: {$basket->price}
</div>
<script>
$(document).ready(function() {
$(document).on("change", ".transport", function() {
$.nette.ajax({
url: {link Transport!},
method: "POST",
data: {"transportId" : $(this).val()},
success: function(data) { // Tahle cast je porvizorni
document.open();
document.write(data);
document.close();
}
});
});
});
</script>
Editoval zoid (20. 6. 2016 18:03)
- igor.pocta
- Člen | 100
Neměl by ten snippet být před tou podmínkou?
<div class="container" n:if="$basket->exists()" n:snippet="basketItems">