AJAX Snippet se po select onchange překreslí jenom jednou
- kachna96
- Člen | 9
Zdravím,
řeším problém s formulářem na editaci údajů, kde si administrátor
může přepínat mezi jednotlivými uživateli pomocí select boxu. Potíž je,
že se formulář překreslí pouze jednou, poté už na změnu v select boxu
nereaguje.
Překreslování formu řeším přes AJAX a Snippety.
Presenter:
public function handleNameChange($id) {
$record = $this->userManager->getRecordById($id);
if(!$record){
$this->error("An error occurred while retrieving information from database, please contact administrators about this.");
}
$this->avatar = $record->avatar;
$this['editWriterProfileForm']->setDefaults($record);
$this['editWriterProfileForm']['users']->setDefaultValue($id);
if ($this->isAjax()) {
$this->redrawControl('editProfile');
} else {
$this->redirect('this');
}
}
Latte:
{block content}
<h1 n:block=title>Admin settings</h1>
<h2>Edit profile</h2>
{snippet editProfile}
{control editWriterProfileForm}
{/snippet}
{include jsCallback, users => users, link => nameChange}
{/block}
JS:
{block jsCallback}
<script>
$('#' + {$control["editWriterProfileForm"][$users]->htmlId}).off('change').on('change', function() {
$.nette.ajax({
type: 'GET',
url: {link {$link}!},
data: {
'id': $(this).val()
}
});
});
</script>
{/block}
Mohl by mi prosím někdo pomoct?
Omlouvám se pokud je řešení zřejmé, ale s AJAXem teprve začínám a
Google mi nepomohl.
- dms
- Člen | 93
Ahoj, problém je v javascriptu. Událost se ti nabinduje při načtení stránky na html select (to je ok). Nette pak díky ajax snippetu vyhodí aktuální html s formulářem a nahradí ho novým html, které už ale nemá nabindovanou událost na změnu selectu. Řešení třeba tady https://forum.nette.org/…u-s-js-prvky
- kachna96
- Člen | 9
Díky! Už mi to funguje.
Kdyby někoho zajímalo řešení, tak stačilo upravit script na:
{block jsCallback}
<script>
$(function(){
$.nette.ext("initOnAjax", {
success: function (payload) {
if (!payload.redirect) {
jsInit();
}
}
});
jsInit();
});
function jsInit() {
$('#' + {$control["editWriterProfileForm"][$users]->htmlId}).off('change').on('change', function() {
$.nette.ajax({
type: 'GET',
url: {link {$link}!},
data: {
'id': $(this).val()
}
});
});
}
</script>
{/block}