Nepřekreslí se mi snippet

před 2 měsíci

ForestCZE
Člen | 66
+
0
-

Ahoj, mám problém s překreslením snippetu a nevím kde.

Šablona:

{snippet expandations}
    <fieldset>
        <legend>HTML5 <a class="expandation" n:href="expandation! pref => 'html5'"><i class="fa {if !$httpServices->getCookie('html5')}fa-angle-up{else}fa-angle-down{/if}"></i></a></legend>
        {if !$httpServices->getCookie('html5')}
            {include listing posts => $postsListing->getAllPostsDescription([1, 2])}
        {/if}
    </fieldset>
{/snippet}

Handle metoda:

public function handleExpandation($pref)
{
    if($this->httpServices->getCookie($pref) == null)
        $this->httpServices->setCookie($pref, true);
    else
        $this->httpServices->deleteCookie($pref);
    $this->redrawControl('expandations');
}

jQuery:

function Expandations()
{
    $("body").on("click", "a.expandation", function(e){
        e.preventDefault();
        var url = $(this).attr("href");

        $.ajax({
            type: 'GET',
            url: url,
            success: function(data)
            {
                $("#snippet--expandations").html(data.snippets['snippet--expandations']);
            }
        });
    });
}

Když kliknu, tak se provede v handle metodě to, co má, ale nepřekreslí se snippet. Když obnovím stránku, tak se to aktualizuje. Co mám špatně? Díky.

před 2 měsíci

Ondřej Kubíček
Člen | 290
+
0
-

nejlepší by bylo, kdybys použil na to již hotovou knihovnu

nicméně v tom success ty data obsahují ten nový snippet? je to tam správně?

před 2 měsíci

ForestCZE
Člen | 66
+
0
-

Ondřej Kubíček napsal(a):

nejlepší by bylo, kdybys použil na to již hotovou knihovnu

nicméně v tom success ty data obsahují ten nový snippet? je to tam správně?

No to právě nevím, nevím, jak si to vypsat. Mi to vyhazuje: [object Object]

EDIT: Hodil jsem si tam:

console.log(data.snippets['snippet--expandations']);

A je tam ten původní, nepřekreslený.

Editoval ForestCZE (24. 8. 14:10)

před 2 měsíci

Ondřej Kubíček
Člen | 290
+
0
-

máš tam metodu render* ? nepřepisuješ si to? protože handle se volá dřív než render

před 2 měsíci

ForestCZE
Člen | 66
+
0
-

Ondřej Kubíček napsal(a):

máš tam metodu render* ? nepřepisuješ si to? protože handle se volá dřív než render

V renderu si volám jenom třídy do šablony.

public function renderDefault()
{
    $this->template->postsListing = $this->postsListing;
    $this->template->httpServices = $this->httpServices;
}

před 2 měsíci

Phalanx
Člen | 221
+
0
-

@ForestCZE nevidím, jestli si něco nepřepisuješ, ale rozhodně bych ti doporučil použít přímo Nette ajax knihovnu, která by se ti měla postarat sama o překreslení snippetu (který ty teď přepisuješ ručně).

<script>
// $.ajax
$.nette.ajax

// a nezapomen inicializovat
$(function () {
    $.nette.init();
});
</script>

před 2 měsíci

ForestCZE
Člen | 66
+
0
-

Phalanx napsal(a):

@ForestCZE nevidím, jestli si něco nepřepisuješ, ale rozhodně bych ti doporučil použít přímo Nette ajax knihovnu, která by se ti měla postarat sama o překreslení snippetu (který ty teď přepisuješ ručně).

<script>
// $.ajax
$.nette.ajax

// a nezapomen inicializovat
$(function () {
    $.nette.init();
});
</script>

Tak jsem to upravil:

$(function()
{
    $.nette.init();
});

A k odkazu jsem do třídy přidal ajax a chová se to úplně stejně, jako když jsem si to přepisoval ručně.

před 2 měsíci

Ondřej Kubíček
Člen | 290
+
0
-

Nevím jestli ten include nemá být obalený snippetArea, ale to myslím jen v případě, že bys měl snippety uvnitř toho includu. A když na test vyhodis include a dáš tam obyč text, stále nic?

před 2 měsíci

MajklNajt
Člen | 68
+
0
-

máš nalinkovaný netteForms.js? ak nie, musíš to upraviť takto:

<script>
$(function () {
    Nette = {
        initForm: function () {}
    };
    $.nette.init();
});
</script>

před 2 měsíci

ForestCZE
Člen | 66
+
0
-

Ondřej Kubíček napsal(a):

Nevím jestli ten include nemá být obalený snippetArea, ale to myslím jen v případě, že bys měl snippety uvnitř toho includu. A když na test vyhodis include a dáš tam obyč text, stále nic?

Stále nic. Zkusil jsem jednoduchý příklad zde a to funguje úplně normálně. Takže já si to musím asi vážně někde nechtíc přepisovat, ale nemám tušení kde.

před 2 měsíci

Zuben45
Backer | 270
+
0
-

A co třeba takhle ?

{snippet expandations}
    <fieldset>
        <legend>HTML5 <a class="expandation" n:href="expandation! pref => 'html5'"><i class="fa {if !$html5Cookie}fa-angle-up{else}fa-angle-down{/if}"></i></a></legend>
        {if !$html5Cookie}
            {include listing posts => $postsListing->getAllPostsDescription([1, 2])}
        {/if}
    </fieldset>
{/snippet}
// Render
public function renderDefault()
{
    if (!isset($this->template->html5Cookie)) {
        $this->template->html5Cookie = $this->httpServices->getCookie($pref) == null
            ? false
            : $this->httpServices->getCookie($pref);
    }
}

// Handle
public function handleExpandation($pref)
{
    if($this->httpServices->getCookie($pref) == null) {
        $this->httpServices->setCookie($pref, true);
        $this->template->html5Cookie = true;
    } else {
        $this->httpServices->deleteCookie($pref);
        $this->template->html5Cookie = false;
    }
    $this->redrawControl('expandations');
}

Editoval Zuben45 (27. 8. 20:35)

před 2 měsíci

Felix
Nette Core | 869
+
+1
-

Pro edukativni ucely jsem udelal tenhle priklad (https://github.com/…ette-webpack). Snippety tam funguji a je tam i Webpack napriklad. Muzes mrknout.

před 2 měsíci

Zuben45
Backer | 270
+
0
-

@Felix díky, příklad pro Webpack se bude hodit :)

před 11 dny

Off0
Člen | 3
+
0
-

Mam také problém s překreslením snippetu. Můžete mi někdo poradit, kde by mohla být chyba ? Zkoušel jsem vytvořit i přes komponentu, také mi nefungovalo a ani přes SnippetArrea s includovaným .latte.

jQuery :

<script>

function start() {

   $.nette.init();
   message_js();

 function message_js() {

        //message
        $.nette.ajax({
            url: "/administration/?do=removeFlashMessage",
            data: {nic: "nic"},
            success: function () {
                $.nette.ext('snippet_test', {
                    success: function (payload) {
                        var snippets = this.ext('snippets', true);
                        $("#snippet--flashes").html(snippets);
                    }

                })
            }});
    }

}
</script>

Presenter :

<?php

  public function renderDefault() {
         $this->template->flashes = array();
        $this->flashMessageCustom("START");
    }

  public function flashMessageCustom($text) {
        array_push($this->template->flashes, $text);
    }

 function handleRemoveFlashMessage() {

        if ($this->isAjax()) {
            $this->flashMessageCustom("TEST");
            $this->presenter->redrawControl('flashes');
        }
    }
?>

Šablona :

<?php

<body>

    {snippet flashes}
        {foreach $flashes as $flash}
            <div class='message'> <img src='./users/images/0.jpg'> <p id='message__text'>{$flash}</p></div>
        {/foreach}
    {/snippet}

</body>

?>

před 11 dny

David Matějka
Moderator | 5650
+
+1
-

ahoj,
priste zaloz radeji nove vlakno, nez otevirat stare

  • co znamena, ze to nefunguje? provede se ten pozadavek a jen se neprekresli snippet nebo se vubec ajax pozadavek neprovede?
  • dival ses do developer tools v prohlizeci, jesti tam neni chyba?
  • inkludujes nette.ajax a volas tu funkci start?
  • tim kodem $this->template->flashes = array(); prepises to, co si zapsal v handleRemoveFlashMessage, jelikoz render metoda se vola po zpracovani signalu (viz dokumentace https://doc.nette.org/…4/presenters#…)

před 11 dny

Ondřej Kubíček
Člen | 290
+
+1
-

@Off0 handle metoda se zavolá dřív než renderDefault tudíž v handle přidáš do flashes druhou položku, pak dojde na render, vymažeš celé pole a znovu tam setneš start
za druhé, proč máš v success $.nette.ext ? ty snippety se překreslí sami, nemusíš si je překřeslovat sám

před 11 dny

Off0
Člen | 3
+
0
-

Ahoj, dobře

  • vyřešeno, bylo to tím životním cyklem, že se mi přepsala proměnná, již mi vše funguje.

Děkuju za ochotu @DavidMatějka

před 11 dny

Off0
Člen | 3
+
0
-

@OndřejKubíček Děkuji za rady, odstranil jsem nadbytečné – $.nette.ext.