ugrás a tartalomhoz

Saját eseményre egyedi feladat fusson le.

s_volenszki · 2009. Feb. 21. (Szo), 17.11
Régebben már foglalkoztam a témával, azonban nem jutottam túl rajta, most előkerült megint.

Ha van egy önálló szubrutin, aminek mondjuk az a feladata, hogy előugró ablakban bekérjen egy e-mail címet, ellenőrizze annak helyességét és mentse adatbázisba, akkor az úgy a legtöbbször felhasználható és legfüggetlenebb, ah a szubrutin a saját feladatán kívül semmilyen más feladatot, parancsot nem hajt végre.

Egyszerűen megoldható, hogy legyen a dokumentumnak egy egyedi esemény figyelés és kezelés, így mikor kész a rögzítés, a szubrutin trigger-el egy készen vagyok eseményt, amire a dokumentumban hozzá társított esemény kezelő lefut.

Azt terveztem, hogy amikor elindul a szubrutin, az azt kiváltó esemény ad információt arról, hogy minek kell majd történnie ha a kiváltott esemény befejeződik. Így könnyedén megoldható, hogy egy bizonyos oldalon az e-mail cím rögzítése után töltődjön újra az oldal, egy másik oldalon meg csak egészüljön ki egy lista az új címmel.

jQuery(document).ready(function(){
    $(document).bind("kesz", function(e){
       //itt hajtódna végre az onReady esemény
    }); 
});

<input type="button" value="Add meg a címedet!" onclick="routEvent('/*paraméterek az eseményhez*/','/*Itt van az onReady függvény*/')" />
Milyen módon érhetem el az esemény kezelőben az onReady értékét? Néhány órát már próbálgattam, és többnyire undefined értéket kapok.

Vissza vissza térek ehhez a bejegyzéshez http://weblabor.hu/forumok/temak/21335, azonban ez nekem tökéletesen kínai.

Amit tudok, hogy valamilyen módon tárolni kellene a bekövetkező eseményekhez tartozó onReady eseményeket, de hogyan?
 
1

Találtam egy példát.

s_volenszki · 2009. Feb. 22. (V), 11.47
Sziasztok!

Találtam itt http://www.dustindiaz.com/javascript-observer-class/ egy példát, amit sikerült értelmeznem.

Nem vagyok rá büszke, de nem mondhatnám, hogy minden apró részletét értem, azonban működésre tudtam bírni...

Még sokat kell tanulnom ezen a téren.
2

eredeti probléma?

Hodicska Gergely · 2009. Feb. 22. (V), 15.18
Az eredeti problémád nem volt igazán világos nekem, pedig elolvastam kétszer is, de nem állt össze. Megpróbálhatnád még egyszer.
3

Nekifutok még egyszer.

s_volenszki · 2009. Feb. 22. (V), 19.01
A Programtervezési minták című könyvben a "Megfigyelő" (observer) viselkedési minta keltette fel az érdeklődésemet.

Nézzünk egy példát:

Ha egy termék nyilvántartási rendszerben számlázás közben kiderül, hogy a vevő még nincs rögzítve, akkor a számlázási folyamathoz képest egy állapottalan folyamat indul el.

Ebben a példában ki a megfigyelő, ki az alany, ki a konkrét megfigyelő és ki a konkrét alany?

Talán a konkrét alanya az új vevő rögzítését folytató objektum, a konkrét megfigyelő meg a számlázó objektum? Mert ugye a számlázó objektum várja, hogy az új vevő rögzítése objektum kimondja, hogy végeztem. Ekkor a konkrét megfigyelő megszerzi az adatokat a konkrét alanytól és frissül.

Vagy a konkrét alany kimondja, hogy végeztem mire a megfigyelő értesíti azt az objektumot, ami a számlázásban a vevő adatainak megszerzéséért felelős. Az megszerzi a szükséges adatokat a konkrét alanytól és megy tovább a számlázás.

Ha elvonatkoztatnánk a programozástól, akkor a megfigyelő az egy olyan személy, aki ismeri egy közösség tagjai közötti összes relációit, így amikor bármelyik alanynál bekövetkezik egy változás, ő minden, az alannyal kapcsolatban álló megfigyelőnek szól, hogy változás történt, mire a konkrét megfigyelők (azért konkrét, mert tudja, hogy rá kihatással van a változás) megszerezhetik a számukra fontos információt az alanytól (aki emiatt a reláció miatt lesz a konkrét megfigyelő számára a konkrét alany).

Mit jelent ez pontosan? A kliens oldali javascript kód betöltődése során létre kell hozni a megfigyelőt és tudtára kell adni az összes relációt?

Hogyan valósul meg az adatelérés? Ha a konkrét alany előugró ablakban objektum, akkor kinek a feladata bezárni az előugró ablakot, miután a konkrét megfigyelő megszerezte az adatokat? És ha többen várnak az adatra?

Hú. Remélem nem fordul be senki...
4

ezen még dolgozni kell :)

Hodicska Gergely · 2009. Feb. 23. (H), 21.13
Ismét legalább másodjára olvastam el, de újfent nem állt össze a kép, kicsit csapongsz, és közben nem írod le a problémát (van egy utalás valamilyen javascriptre, de nem tiszta, hogy mi a szerepe).

Szóval szerintem írd le a konkrét problémát, és hogyan tervezed megoldani, és első körben ne keverj bele elméleti dolgokat, mert nehezebb érthetővé teszi a szöveget (terminológia is kicsit furcsa).
6

Sejtettem...

s_volenszki · 2009. Feb. 23. (H), 22.36
Rendben, lássuk az alapoktól.

Kliens szerver modellben felépített (MVC) termék nyilvántartás klasszikus alapokon (szerver oldalon php+mysql, kliens oldalon javascript+html).

Mindent megteszek, hogy a legjobban tudjak kódot újrahasznosítani, azonban nem csak egyszerűen kódot, hanem az alkalmazás egyes komplett egységeit is.

Konkrét példa az, amikor a nyilvántartásba két különböző módon kerülhet új beszállító:

1. Az beszállítók kezelése során az új beszállító hozzáadása menüpontban
2. Új termék rögzítése közben, az új termék űrlapon

Az a célom (és minden ilyen hasonló esetben), hogy mindkét esetben ugyan az a programrész (ami egyénként egy előugró ablak) végezze el az új beszállító rögzítését. Ahhoz, azonban, hogy ez teljesülhessen, ennek a program résznek nem szabad információt hordoznia arról, hogy mi is történjen, mikor sikeresen végbemegy az új beszállító rögzítése.

Mert az 1. esetben a beszállítók listájának kell frissülnie, a 2. esetben pedig az új termék rögzítése adatlapon, a beszállítók legördülő menübe kell belekerülnie az újonnan rögzített beszállítónak.

Azt gondoltam, megtehetném azt, hogy az az esemény, ami kiváltja az új megbízó rögzítését elvégző programrész elindulását, az ezzel egy időben meghatározhatná azt is, mi történjen akkor, mikor az esemény végbement. Az esemény végbemenetelét pedig egy egyedi javascript esemény trigger-elése jelez.

Valahogy így:

1. eset:

<input type="button" value="Új beszállító" onclick="routEvenet('newsupplyer','refreshSuppliersList();');">
2. eset:

<input type="button" value="Új beszállító" onclick="routEvenet('newsupplyer','loadSuppliers();');">
Mindkét esetben mielőtt előugró ablakban megjelenne az új beszállítót rögzítő programrész, letárolom az onReady eseményt, ami ez első esetben a beszállítók listájának frissítését eredményezi, a második esetben pedig a beszállítók legördülő menü frissítését.

Bekövetkezik a "kész vagyok" esemény, és kiváltáskor letárolt esemény lefut.

A bajom az, hogy megcsináltam, működik, de nem teljesen értem.
9

observer szvsz nem kell ide

Hodicska Gergely · 2009. Feb. 24. (K), 10.23
Melyik részét nem érted?

Amúgy szerintem jól csináltad, observer ide szerintem fölösleges, hacsak nem valahogy mélyebb szinten építőeleme a rendszernek, hisz itt van egy konkrét eseményed, aminek a sikeressége esetében kell valamit csinálni.

Egy apróság: érdemes jobban odafigyelned, hogy egységes stílusban programozz (egységesen camelCase legyen), illetve ha már angol elnevezéseket használsz, akkor figyelni, hogy az angol szavakat jól írd le (rout -> route, valamint a supplyer -> supplier).

Még egy apróság: érdemes lenne a dinamikus működést leválasztani a HTML-ről, és egy init folyamat részeként ráaggatni a különböző elemekre a kezelőket. Illetve érdemes lenne úgy kialakítanod, hogy egy adott felületi elemhez tartozzon egy JS objektum, ami egységesen leírja az adott elem működését.

És még egy észrevétel: JS esetén szerintem érdemesebb lehet paraméterként objektumot használni, nem pedig több paramétert, így olvashatóbb, és flexibilisebb lehet a kódod: routeEvenet('newSupplier', {onSucces: loadSuppliers, onError:foo})

És még egy utolsó: kicsit fura ez a paraméter: 'refreshSuppliersList();', ugy nem evalozol ;)?
11

Elfogadom a kritikát.

s_volenszki · 2009. Feb. 25. (Sze), 00.04
Köszönöm, hogy figyelmeztettél és teljes egészében igazad van, a jövőben jobban odafigyelek majd (angol szavak, camelCase)!

Szemléletet kell váltanom, úgy érzem ha nem lépek feljebb egy szintet, jelentősen hátráltatom a saját fejlődésemet.

s_volenszki
5

Jól értem?

Ustak · 2009. Feb. 23. (H), 21.40
Röviden ilyesmire lenne a cél?

1; Esemény hívása indul - és eldől hogy mi lesz a kimenet (de ezt csak a hívás pillanatában tudjuk meg)
2; Esemény kódja lefut;
3; Az 1; pontban leírt kimenet szerinti esemény(ek) hívása megtörténik.

Ilyenen gondolkozzak?
7

Igen, jól érted!

s_volenszki · 2009. Feb. 23. (H), 22.39
Tökéletesen jól érted!

Valami olyasmi ez, mintha az én routEvent függvényem olyan lenne, mint egy ajax hívás, amiben van beforsubmit, onsucces meg onerror esemény figyelés, és az ott definiált függvények eseménytől függően lefutnak.

Lehet, hogy már az is sokat segítene, ha megértenem, egy ilyen ajax hívás hogyan épül fel. Hogyan csinálok belöle olyan objektumot, aminek vannak eseményei, eseményenként függvényei és esemény figyelői.
8

ajax esemény

Hodicska Gergely · 2009. Feb. 24. (K), 10.06
Lehet, hogy már az is sokat segítene, ha megértenem, egy ilyen ajax hívás hogyan épül fel.
Ajaxról töménytelen mennyiségű infó van a neten. Ha "kézzel" csinálnád, akkor nagyon leegyszerűsítve van a kérést intéző objektumnak egy property-je, amiből folyamatosan ki lehet olvasni, hogy mi is a kérés állapota (elküldés alatt, sikeres stb.), ha aszinkron a hívás, akkor ezt kell periódikusan figyelned. Egy klasszikus a témában ;) (ekkor még nem is volt AJAX).

Hogyan csinálok belöle olyan objektumot, aminek vannak eseményei, eseményenként függvényei és esemény figyelői.
Bármelyik JS framework támogatja azt, hogy az AJAX kéréshez kapcsolodó különböző eseményekre tudj kezelőket megadni (onError, onSucces stb.).
10

Dugjuk be

Ustak · 2009. Feb. 24. (K), 22.09
Szerintem ez egy tök jó téma arra, hogy plugint írjunk rá. A kezdetek át is futottak pici tudatomon, de ide csak egy "pszeudopluginkódot" biggyesztek, mert kérdőjelek vannak, és nem szabad őket elsietni:-)

//closure indul
(function($) {
$.fn.addObserver=function(figyelendoObject, figyelokObjectje) {
   //itt lenne egy ellenőrzés, hogy a két objektumom megvalósítja -e az interfészt, amit elvárunk tőlük (minden tulajdonság helyén van -e)
   return this.each(function(){
    //kössük az eseményt a dom-elemhez
    $(this).bind(figyelendoObject.esemenyTipus,function(){
    //fontos -e a visszateresi érték?
    var visszateresi_ertek=figyelendoObject.esemenyFuggveny();
    /*Első kérdőjel. Igaz hogy itt kaphatok visszatérési értéket, de mi történik, ha
      a kódom egy generált div generált gombokkal, tehát a kód tovább fut ihol, a 
      felhasználó gondolkozik, és még nem nyom... Megoldás lehet egy custom esemény
      fűzése az elemhez, amit esetleg paraméterezünk aszerint hogy most hívódott -e 
      meg vagy pedig a felhasználó beavatkozása hívta meg....nem tudom érthető?*/
    
   //az egyszerű mód
    if (visszateresi_ertek=='error') {
      figyelok.errorFuggveny();
      } else if (visszateresi_ertek=='success') {
      figyelok.successFuggveny();
      } //stb stb.
     /*További kérdőjelek: Mennyi figyelőm van, mely figyelők tartoznak az adott
      elemhez, mindet meg kell -e hívni, a figyelőn levő esetleg más eseményekkel
      akadhatok -e össze, vagy töröljem őket (unbind) már létező eseményeket hívok
      meg vagy a fenti kód kapcsolja a figyelőkhöz az eseményeket, stb stb..
      Jó lenne minél általánosabb megoldást találni rá!*/

     });

   });



};

//closure vége
})(jQuery);

Remélem nem baj hogy megosztottam ezen ötletet, de még van min tűnődni, és fogok is :-)
12

Az én esetemben...

s_volenszki · 2009. Feb. 25. (Sze), 00.14
Nagyon örülök, hogy érdekel a téma!

Az én esetemben a figyelő és az alany viszonya egymáshoz képest parent és popup. Mivel stratégiailag egy parent-nek egy időben csak egy popup-ja lehet, azonban minden popup-nak lehet maximum egy popup-ja (tehát minden popup lehet parent is, amikor a popup-nak lesz saját figyelője), ezért a figyelő mindíg csak egy eseményt figyel.

s_volenszki
13

-

carstepPCE · 2009. Feb. 25. (Sze), 11.51
hali,

ha jol sejtem te a Signal/Slot model-t akarod keverni egy kis modalis, nem modalis gui implementacioval. Szerintem erre vannak kesz javascript keretrendszerek, hasznald szerintem azok kozul valamelyiket. Sot megkockaztatom, hogy jQuery-hez is van ilyen plugin. Neked mindossze csak az ablakozo objektumokat kell majd kezelni, illetve azok allapotat.

-cs-
Sanyi

UI.: bocs, hogy nem erdemi hozzaszolas, csak atfutott az agyamon
14

Nem érdemi? Ne viccelj...

s_volenszki · 2009. Feb. 25. (Sze), 14.12
Nem érdemi? Ne viccelj! Életemben nem hallottam erről a modellről, így aztán értékesebb mint gondolnád!

Köszönöm!
15

-

carstepPCE · 2009. Feb. 25. (Sze), 17.34
en sem tul regota tudok rola. Miota az ezComponents hasznalom, azota neztem meg az elmeleti alapjait ennek a modelnek, elotte csak volt valami sejtesem, hogy van ilyen, de nem hasznaltam eddig. Viszont a ezComponenetsben es az uj alkalmazasban, nagyon hasznosnak tunik nekem.

-cs-
Sanyi