2013. május 2., csütörtök

Volt egy ilyen kódom:

Volt egy ilyen kódom:

for(i=0; i  var button = xbuttons[i];
  button._.add(function() {
    console.log(button);
  });
}

Végigmegy egy gomb listán, és eseménykezelőt rak minden gombra. Az volt vele a gond, hogy akármelyik gombot is nyomtam meg, mindig az utolsó gombot írta ki. Logikusnak is tűnne a dolog, ha nem lenne var a button változó előtt, mivel ugye ebben az esetben a button a legutolsó értéket hordozza. Gondoltam, hogy ha a var-t odateszem, akkor a button változó minden körben létrejön, és így már jól fog működni, de ugyanazt csinálja, mint var nélkül. Végül kénytelen kelletlen egy olyan csúnya megoldást választottam, hogy egy anonim függvénybe raktam a ciklusmagot, így:

for(i=0; i  (function() {
    var button = xbuttons[i];
    button._.add(function() {
      console.log(button);
    });
  })();
}

Így mindig az új anonim függvényhez fog tartozni a változó, és ez így jól is működik, csak nem tetszik.

Nincs erre valami normálisabb megoldás? Nem Array.forEach, vagy $.each. Azokat ismerem, de ott végül is ugyanez történik, csak szebb. Szóval így, for ciklusosan nem lehet valahogy megoldani anonim fv. nélkül? Eddig a var-ról gondoltam azt, hogy jó lehet erre, mivel minden eseménykezelő másik saját button példányt kap, de ezek szerint nem.

Balazs Nadasdi

14 megjegyzés:

  1. Leülök géphez és nem mobilról leszek meg is válaszolom.

    Csak mert több ponton nem jó ez így :-)

    VálaszTörlés
  2. No tehat... Ciklusban nem csinalunk fuggvenyt. Veletlenul sem ^^.

    var buttons = bla bla bla;
    (function() {
      var addfunction = function() {
        console.log(this);
      };
      for (var i = 0, _l = buttons.length; i < _l; i++) {
        buttons[i]._.add(addfunction);
      }
    })();



    igy egy fokkal jobb. az alulvonas nem tudom mi ott, de gondolom az valami lib vagy helper resz es az elemhez az hozza igy this-kent ugyan ugy elered elvileg.

    Ciklusban nem csinalunk fuggvenyt.

    Valtozot csak akkor nevesitunk, ha nagyon fontos, mert memoria :)

    Ciklusnal tobbnyire elofeltetelkent elmentem a tomb hosszat is, hogy a ciklusonkent mar ne kerdezze le amikor teszteli, hogy kell-e meg futni.

    a kulso fuggveny pedug azert hasznos mert peldaul
     - a fuggveny vegeztevel az ott definialt valtozok is elvesznek, amik nincsenek hasznalva (gc).
     - nem zavarjak egymast a hasonlo nevu fuggvenyek, meg amugy se tartozik a tobbi kodreszre az, hogy o mit csinal
     - gyorsan atadhato parameterben ha kell neki valami (legutolso dev.folyam.info -s cikkben pl a C a kontrollereknel)
     - gyorsan atpakolhato, letilthato a meghivasa nevesitheto tobbszori meghivasra.

    VálaszTörlés
  3. Elmesélitek nekem mire való ez az add function dolog? Tökre nem értem. Én valami ilyet csináltam volna helyette:

    http://jsfiddle.net/UBLDN/

    VálaszTörlés
  4. Nem biztos, hogy click-re pakolod. Sot az is lehet csak az objektumra pakolsz egy fuggvenyt.

    VálaszTörlés
  5. Balazs Nadasdi A tiéd valóban optimálisabb, de működésre ugyanaz. (Amúgy jók amiket írsz, meg is fogadom őket.) Itt nálam az volt a gond, hogy a this az nem a gomb, hanem csak az eseménykezelő, így ha a gombbal csinálok valamit, ahhoz a gombot kívülről kell bedobni a fv.-be. Java-nál ez úgy ment, hogy nem fv,-ek, hanem objektum példányok az eseménykezelők, és az objektumon kívül ha final-al definiálok egy változót, akkor elérem az objektumból, és mivel minden körben új változó jön létre, amit megkap az objektum, ezért minden objektum a saját buttonjára hivatkozik. Azt hittem, hogy var button-nál ugyanez történik, de nem egészen. Azt hittem, hogy úgy minden eseménykezelőnek saját példánya lesz a buttonból. De egyre inkább úgy látom, hogy ezt js-ben így nem lehet.

    Robert Cartman Ezek nem olyan HTML gomb gombok, hanem van egy zebra ui nevű cucc, amivel egy canvas-on alakíthatsz ki UI-t, és annak a gombjaira akartam így rátenni az eseménykezelőt. (https://github.com/barmalei/zebra)

    VálaszTörlés
  6. Na most már legalább tudom, hogy mit nem értek XD

    VálaszTörlés
  7. Laszlo Fazekas de az esemenykezeloben csak elered mar az aktualisan targetelt elemet =)

    VálaszTörlés
  8. Balazs Nadasdi Hát, elvileg nem, de majd megnézem még. Úgy egyszerűbb lenne, persze. Az a baj, hogy semmi doksi nincs, csak pár példa, meg a forrás, úgyhogy mindent onnan nézegetek ki. De lehet, hogy felfújom a pofám, és írok egy saját canvas-os ui toolkitet. Végül is nem olyan nagy varázslat, és canvas nagyon okos. Tud pl. eleve gradient-el kitölteni. Így pedig egy button pl. csak egy lekerekített téglalap gradient-el kitöltve a közepén valami szöveggel, a label sima szöveg, a radio button két kör, stb. Az eseményeket meg pozíció alapján szét kell dobni, és kész. Amúgy is gondolkodtam rajta, hogy kellene valami nagyon egyszerű UI leíró nyelv, amihez könnyű renderert írni bármilyen platformra. Vannak ilyenek, pl. a Mozilla féle XUL, csak ezek mind el vannak bonyolítva, így nehéz őket portolni.

    VálaszTörlés
  9. Ezt amit irtatok vegig olvasni nekem olyan mint a Star Trek egy harom evesnek

    VálaszTörlés
  10. Melyik resz nem tiszta? Tok szivesen kifejtem ^^. (akar cikk kereteben is)

    VálaszTörlés
  11. Nekem már ott elakadt a gépezet, hogy a .add() függvényt se találtam a neten meg.

    VálaszTörlés
  12. Robert Cartman miért keltene hogy létezzen?

    VálaszTörlés
  13. Jah hogy ez saját? Én meg gugliztam egy fél órán keresztül XD

    VálaszTörlés