Po zajaxování nefunguje selectBox
- petas.ck
- Člen | 12
Ahoj. Už pár dní se tu trápím s problémem ohledně dynamického
načtení podkategorie. Vycházel jsem z tohoto
článku. Řekněme, že máme jeden select box, do kterého na nahraji
jednotlivé kategorie a po vybrání jedné z nich se načtou do druhého
select boxu její podkategorie (pokud existují). Vcelku běžný
případ.
Problém nastává jakmile se provede ajaxový dotaz, tak se sice podkategorie
správně načtou, ale v tu chvíli je select box, do
kterého se podkategorie načetly „nepoužitelný“. Neboli při
odeslání formuláře se u vybrané podkategorie vypisuje NULL
(u prvního select boxu je to v pořádku), na jquery
$('select option').click(function ...
, change … nereaguje. Ve
zdrojovém kódu neobsahuje vlastnost selected, ikdyž je položka vybrána.
Zkoušel jsem vlastnost selected přidat i v js funkci, ve které odesílám
požadavek, ale ani to nereagovalo.
verze nette 2.0, php 5.4 – 5.5
Takto vypadá vytvoření komponenty v HomePresenteru:
...
public function renderDefault() {
$this->template->_form = $this['deleteCategoryForm'];
}
public function createComponentDeleteCategoryForm() {
$form = new Form();
$form->addSelect('categorySelect', 'Výběr kategorie', $this->listCategory)
->setPrompt('select');
$form->addSelect('subcategorySelect', 'Výběr Subkategorie')
->setPrompt('select sub');
$form->addSubmit('deleteSelected', 'Vymazat označenou');
$form->onSuccess[] = callback($this, 'deletePhotosSuccess');
return $form;
}
...
Požadavek odesílám takto:
...
$('#frmdeleteCategoryForm-categorySelect').live('change', function(event) {
event.preventDefault();
$.get("http://localhost/nette_projects/fotobanka/edit-category/?category_id=" + $("select option:selected").val() + "&lang=sk&do=reloadSelect");
$("#ajax-spinner").show();
});
...
V šabloně poté vykresluji:
{form deleteCategoryForm}
<fieldset>
<legend>Mazání kategoie</legend>
<table>
<tr>
<td class="requiredA-s">{input categorySelect}</td>
<td class="requiredA-s">{snippet}{input subcategorySelect}{/snippet}</td>
<td><div id="ajax-spinner"></div></td>
</tr>
<tr>
<td colspan="3" align="right">{input deleteSelected}</td>
</tr>
<tr>
<td colspan="3">
<ul class=error n:if="$form->errors">
<li n:foreach="$form->errors as $error">{$error}</li>
</ul>
</td>
</tr>
</table>
</fieldset>
{/form}
A takto vypadá ajax handle:
public function handleReloadSelect($category_id) {
$result = $this->editCategoryRepository->getSubCategory($category_id);
if (count($result)) {
$items = array();
foreach ($result as $key => $value)
$items[$key] = $value->name;
$this['deleteCategoryForm']['subcategorySelect']->setPrompt('Vyberte kategorii');
$this['deleteCategoryForm']['subcategorySelect']->setItems(array(0 => 'aaa', 1 => 'bbb'));
} else
$this['deleteCategoryForm']['subcategorySelect']->setPrompt('Žádná podkategorie');
$this->invalidateControl();
}
Problém tedy nastává v o okamžiku, kdy se vykoná ajaxový požadavek a subkategorie se nahrají do selectboxu. Připomínám, že po kliknutí na kategorii se subkategorie v pořádku nahrají, jak mají.
Nemáte někdo tušení, kde bych mohl dělat chybu?
Děkuji moc za pomoc a čas.
- iNviNho
- Člen | 352
<script>
$('select option').click(function ..., change … nereaguje
</script>
toto asi ani nepojde, skúsil by som
<script>
$("tvojselect").change(function() {...})
</script>
Vyskúšaj zmeniť
<?php
public function renderDefault() {
$this->template->_form = $this['deleteCategoryForm'];
}
na
public function actionDefault() {
$this->template->_form = $this['deleteCategoryForm'];
}
?>
Nič iné ma zatiaľ nenapadá :-\