Signál na onchange se zavolá pouze jednou

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
lukendo
Člen | 96
+
0
-

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
+
0
-

@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)

lukendo
Člen | 96
+
0
-

oki, vyzkouším.
Ve zkratce: mám select a když se vybere položka, tak 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. proto ten signál s parametrem id.

Editoval lukendo (11. 9. 2016 14:46)

GEpic
Člen | 562
+
0
-

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
+
0
-

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

lukendo
Člen | 96
+
0
-

Ten formulář mám jako továrnu, jde v ní nějak zjistit presenter?
jinak syntaxe je zřejmě špatná – odkazuje mě to na tuhle url

http://localhost/reporty/www/reports/add/findMatch!

Editoval lukendo (13. 9. 2016 11:51)

lukendo
Člen | 96
+
0
-

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

Michal Hlávka
Člen | 190
+
0
-

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?