signál v komponentě – Neposílají se data do šablony

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

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!

David Matějka
Moderator | 6445
+
0
-

ukaz sablonu ty komponenty

zoid
Člen | 12
+
0
-

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
+
+1
-

Neměl by ten snippet být před tou podmínkou?

<div class="container" n:if="$basket->exists()" n:snippet="basketItems">
zoid
Člen | 12
+
0
-

Fungovalo, díky!