Signál na onchange se zavolá pouze jednou
- lukendo
- Člen | 96
Zdravím, mám selectbox kde po změně hodnoty v něm volám signál, který se vykoná pouze při prvním načtení stránky, což tak trochu nechci. Událost onchange se volá, ale už se nevykoná ta ajaxová fce. Děkuji za rady.
$("#frm-addNewReportForm-product_name").change(function() {
var s = document.getElementById("frm-addNewReportForm-product_name");
var id = null;
$("#frm-addNewReportForm-product_name option:selected").each(function() {
id = s.options[s.selectedIndex].value;
});
$.nette.ajax({
url: {link findMatch!},
type: 'GET',
data: {
'id': id
}
});
alert(id); /*id se nastaví dle aktuálně vybrané položky*/
});
Jinak, takhle jsem to řešil před tím použitím ajaxu, chápu že to asi není úplně best practises, ale zajímalo by mě, proč po vykování toho signálu v tom selectboxu nezůstala ta vybraná položka, ačkoli nebyla v žádném snippetu, kdežto o u ajaxu tam zůstává.
window.location = "http://localhost/project/www/reports/add/"+id+"?do=findMatch";
- Landsman
- Člen | 152
@lukendo Nepracuješ tam vůbec s success, error. Bylo by fajn zmínit, co má ten signál vykonat.
Kód bych viděl takto:
latte:
<select data-signal-findmatch="{link findMatch!}">
</select>
nejaky externi js soubor (můžeš ho pak minifikovat atd):
var addReportFrom = $("#frm-addNewReportForm-product_name");
addReportFrom.change(function()
{
var value = $("option:selected", this).val();
$.nette.ajax(
{
url: $(this).attr("data-signal-findmatch"),
type: "POST",
data: {
"id": value
},
success: function(payload)
{
console.log("Co chceš provést s DOM?");
console.log(payload);
},
error: function(xhr, ajaxOptions, thrownError)
{
console.warn(xhr.status);
console.warn(thrownError);
}
});
});
Ještě bych doporučil nastavit si selectu ručně identifikátor, nestane se ti, že se ti změní pokud se selectem hýbneš – změníš name.
Zápis pro Forms asi takto:
$presenter = $form->getPresenter();
$form->addSelect('product_name', 'Nazev selectu')
->setItems($select)
->setAttribute('data-signal-findmatch', $presenter->link('findMatch!'))
->setAttribute('id', 'productNameSelect');
Tím zápisem signálu si z hlavy teď nejsem jistý, ozkoušej.
Editoval Landsman (11. 9. 2016 13:42)
- GEpic
- Člen | 566
chci najít v databázové tabulce zda tam je už ta položka obsažená, aby se nepřidávali zbytečně duplicitní záznamy
Nešlo by toto vyřešit už před vykreslením samotného selectboxu?
Nebo aplikaci využívá naráz tolik uživatelů, že se data ze vteřiny na vteřinu mění a proto je potřeba to ověřovat?
Editoval GEpic (11. 9. 2016 14:55)
- lukendo
- Člen | 96
GEpic napsal(a):
chci najít v databázové tabulce zda tam je už ta položka obsažená, aby se nepřidávali zbytečně duplicitní záznamy
Nešlo by toto vyřešit už před vykreslením samotného selectboxu?
Nebo aplikaci využívá naráz tolik uživatelů, že se data ze vteřiny na vteřinu mění a proto je potřeba to ověřovat?
nešlo, ve zkratce: v tom selectboxu je cca 5000 řádků a když uživatel bude chtít pro tu jednu položku přidat záznam, tak mu to ukáže jaké záznamy tam už pro tu vybranou položku aktuálně jsou
- Michal Hlávka
- Člen | 190
lukendo napsal(a):
nakonec vyřešeno
url: window.location.href + val +"?do=findMatch",
není to sice best practices, ale jelikož se moc v js neorientuju tak jsem to udělal takhle
@lukendo a proč ten odkaz negeneruješ tak, jak poradil @Landsman?