Nepřekreslí se mi snippet
- ForestCZE
- Člen | 209
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.
- Ondřej Kubíček
- Člen | 494
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ě?
- ForestCZE
- Člen | 209
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. 2018 14:10)
- Ondřej Kubíček
- Člen | 494
máš tam metodu render*
? nepřepisuješ si to? protože handle
se volá dřív než render
- ForestCZE
- Člen | 209
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;
}
- Phalanx
- Člen | 310
@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>
- ForestCZE
- Člen | 209
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ě.
- Ondřej Kubíček
- Člen | 494
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?
- ForestCZE
- Člen | 209
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.
- Zuben45
- Člen | 268
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. 2018 20:35)
- Felix
- Nette Core | 1247
Pro edukativni ucely jsem udelal tenhle priklad (contributte/webpack-skeleton). Snippety tam funguji a je tam i Webpack napriklad. Muzes mrknout.
- Off0
- Člen | 3
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>
?>
- David Matějka
- Moderator | 6445
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 vhandleRemoveFlashMessage
, jelikoz render metoda se vola po zpracovani signalu (viz dokumentace https://doc.nette.org/…n/presenters#…)
- Ondřej Kubíček
- Člen | 494
@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