Minek nevezzelek (UI komponens)
Sziasztok!
Hatalmas problémám van :D Csinálok egy olyan container-t, ami az függőségeket tölti be ajax-al aszinkron módon. Amíg tölt, addig kiírja, hogy "Kis türelmet!", vagy valami hasonlót, ha betöltött mindent, akkor kiteszi a tényleges tartalmat, ha meg nem jött össze, akkor meg valamilyen hibaüzenetet. Valahogy így fogom használni:Egyelőre SyncBox-nak nevezem, mert Backbone.sync-et használ majd ahhoz, hogy pl a Role modelt szinkronban tartsa a szerverrel. Kicsit hajaz a SandBox-ra, mert ő szolgáltatja a környezet egy részét (a model-eket, esetleg további konfigurációs változókat) a benne lévő tartalomnak, meg mert olyan, mint egy doboz, beleszórod a dolgokat, aztán megjeleníti, ha a függőségeket sikerül betölteni...
Az a kérdés, hogy van erre a típusú UI komponensre valami kiforrott név, amit sokan használnak, esetleg van ötletetek valami jobb elnevezésre ennél?
■ Hatalmas problémám van :D Csinálok egy olyan container-t, ami az függőségeket tölti be ajax-al aszinkron módon. Amíg tölt, addig kiírja, hogy "Kis türelmet!", vagy valami hasonlót, ha betöltött mindent, akkor kiteszi a tényleges tartalmat, ha meg nem jött össze, akkor meg valamilyen hibaüzenetet. Valahogy így fogom használni:
syncBox.parallel(function (){
syncBox.fetch(new Role({id: id}));
syncBox.fetch(new UserSet()),
},
function (role, users){
var form = new RoleUpdateForm({
model: role,
users: users
});
form.on("submit", function (){
syncBox.save(role, function (role){
controller.read(role.id);
});
});
syncBox.render(form, {persist: false});
});
Az a kérdés, hogy van erre a típusú UI komponensre valami kiforrott név, amit sokan használnak, esetleg van ötletetek valami jobb elnevezésre ennél?
require?
(ha nincs még Role, akkor azt az első függvényben hogyan használhatod, ha meg van, akkor mit is kell még betölteni?)
Kimaradtak részek. A Role egy
Mondjuk a parallel jelen esetben annyit csinál, hogy a két kérést elindítja párhuzamosan, aztán figyeli az eredményüket. Amikor megjött az eredmény, akkor hívja meg a második függvényt, ami gyakorlatilag a done-nak felel meg. Az rajzolja ki az űrlapot...
ajax
Gondolom nem szkripteket tölt
Mindegy
Okés, akkor írok kicsit
Vannak a backbone-ban sync-et használó metódusok. Ezek tipikusan xhr-t küldenek, és aszinkron kommunikálnak a szerverrel. Ezzel kapcsolatban probléma, hogy vagy parallel, vagy series, de csináljunk több kérésből egy egységet. Mondjuk jelen esetben a két model-nek kell betölteni az adatait, és az űrlap csak akkor működőképes, ha mindkét model-nek megvannak az adatai. Mondjuk a Role-hoz, mint szerepkörhöz tartoznak felhaasználók, így kell a teljes UserSet ahhoz, hogy ki lehessen rajzolni egy TwoListSelection-t, aztán oda-vissza pakolni, hogy melyik felhasználó tartozik a role-ba, és melyik nem. Nyilván az, hogy jelenleg melyik tartozik bele, az megjön a Role.fetch-ből...
Azt csinálja a box, hogy összefog különböző aszinkron metódusokat, és amíg vagy series vagy parallel (vagy bármilyen tetszőleges úton módon) az összes le nem fut, és meg nem érkezik a válasz, addig kitesz valamilyen loading feliratot (esetleg akár %-al is). Ha közben valamelyik kéréssel gond van, akkor leállítja az összes többit, és kitesz egy hibaüzenetet. Ha minden kérés sikeres volt, akkor meghívja a paraméterben megadott callback-et, ami képes átírni a syncBox tartalmát. Jelen esetben egy űrlapot szórtam bele. Ez nem a végállapot, szóval ezek után is lehet új kérést indítani, azt meg meg lehet adni, hogy az előzőleg beleírt tartalom ilyenkor eltűnjön, vagy sem. Pl a form.submit-ra a role.save fut le, és mivel nincs persist-re rakva a form, ezért a submit-ra kattintáskor eltűnik. Mondjuk ez a része még nem annyira kidolgozott, több tapasztalatra lesz szükség azzal kapcsolatban, hogy itt pontosan mire van szükség, és mire nincs...
Nyilván gyorsabb lenne, ha egy fájlban menne minden kérés, viszont akkor már nem REST service-ről beszélnénk szerver oldalon. Kliens oldalon sem tartom annyira fontosnak az optimalizálást, mert úgyis csak egyszer fog betöltődni, onnantól meg benne lesz minden a böngésző cache-ében statikus fájlok formájában. Ha mégis nagyon lassú lenne elsőre, akkor tolok rá egy r.js-t, aztán leoptimalizálom egy fájlba.
Azt hiszem a kezdeti kérdések
Szerk:
Ez lett a vége:
Szét fogom darabolni több állapotú kijelzőre és aszinkron állapot dekorátoros panelre. Végülis ez utóbbi is több állapotú kijelző, szóval két ilyen kijelző van egyben ^^ Az egyiknek automatikusan változik az állapota attól függően, hogy pending, error vagy success van az aszinkron kéréseknél, amik a szerver felé mennek, a másiknak meg manuálisan változik az állapota attól függően, hogy éppen melyik kéréseknél volt success. Jobb lenne, ha a több állapotú GUI komponensek között körülnéznék, biztosan van valami best practice erre...
Szerintem...
(elöljáróban ez a komment, inkább csak brainstorming jellegű, mivel a körülményeket nem ismerem:)
Leírom az ExtJS-es megközelítést, sok hasonlóság van, de lényeges különbségek is vannak.
Nincs erre külön komponens, hanem minden komponens ősével végezhetjük el ezeket a fajta feladatokat. Minden komponensnek kell tudnia eseményt kezelni, illetve akár esemény sorozatot lekezelni.
A render(...) függvény elnevezés szerintem félrevezető, ExtJS-nél fireEvent(eventName) van, már csak azért is zavaró, mert használod a render() függvényt, gondolom az valóban a form kirajzolása.
A feladat tehát az, hogy az esemény előtt lefutassunk egy másik eseményt és az hatással legyen a valódi eseményre. ExtJs-ben ez mindenhol beforeEventName elnevezésű esemény. (ez csak szabvány) Pl. van egy load esemény, ekkor először meghívódik a beforeLoad esemény, amennyiben az nem false értékkel tér vissza, akkor meghívódik a load esemény.
Szerintem szebb lenne, ha a RoleUpdateForm a fentieket lekezelné magában, és amikor használod ezt a komponenst, akkor ezekkel egyáltalán nem kellene foglalkoznod. Az zavar ebben a kódban, hogy túl sok olyat kell leírni, ami nem biztos, hogy változik, ha máshol is használnám ezeket az osztályokat. Illetve jelenleg ezek nélkül nem is használható. (ha nem tévedek)
Azaz a RoleUpdateForm esetében az onBeforeUpdateForm privát függvényben minden esetben egy Ajax Queue-nek átadod a két fetch()-et, amikor ez végez, akkor meghívja az onUpdateForm szintén privát függvényt.
Persze mondom ezt úgy, hogy nem ismerem a körülményeket, tehát lehetséges, hogy egyáltalán nem illik ez oda, de gondoltam, hátha ötletet ad a továbblépésre. :)
Semmi gond nincs a
Itt a lényegi különbség a két dolog között, itt nincs visszatérő érték, mert nem szinkron, hanem aszinkron dolgok történnek a cucc megjelenítése előtt.
Több olyan komponens is van, ami adatok lerántására várhat, de ez nem kötelező jellegű. Mondjuk van egy SelectManyInput vagy TwoListSelection, aminek be kell töltenie a szerepkörhöz tartozó felhasználókat, és a teljes felhasználó listát, amiből ezeket kiválasztjuk. Aztán van a teljes űrlap, ami akár még több ilyen komponenst is tartalmazhat. Nyilván az ember nem akarja mindegyikbe betenni, hogy
A mostani megoldásom sem jó egyébként, mert ez az állapot megjelenítő komponens nem ismeri előre az összes állapotát.
No körülbelül erről van szó a
(Nincs téma)
:D :D :D
Másik példa?
Érdekes, én pont arra gondoltam, hogy olyanokat írnék a komponens kódjába, amire azt írtad, hogy nyilván nem. :)
Engem nem zavar, hogy a komponenseimnek van egy rakás nem kötelező mezője, amit inicializáláskor egyesével ellenőrzök. Inkább a komponensben írok ilyeneket, mint ott, ahol használom a komponenst.
Tudnál egy másik példát is írni? Ahol kijönne ennek a konténernek az előnye.
Hülyeséget kérdezek, de ebben
Van request, sync és error event a model-en, azokra lehet bindelni figyelőket... A model-t azért kell megadni, hogy tudjon bindelni ezekre, a fetch-et meg azért nem string-ben adom meg, mert úgy nem valami szép. Arra gondoltam, hogy amíg az első request le nem zárul, addig lehet majd újakat hozzáadni a task list-hez, így nem kell kézzel lezárni valamilyen függvénnyel a listát...
Na hát ez jó kérdés... Ez a minta rendeszeresen megjelenik a kódomban. A mostani oldalam vázában van header, content, footer, stb... Arra gondoltam, hogy a content egy az egyben lehetne ez a container, aztán ha valamelyik aloldalt töltöm be, akkor automatikusan kiteheti mindig a loading feliratot, meg esetleg a hibaüzeneteket. Eléggé céleszköz, nem hiszem, hogy másra használható ilyesmiken kívül...
Így már értem...
Érdekes, én nagyon ritkán használok Ajax Queue-t, azaz ritkán kérek le úgy két Ajax hívást, hogy azok így összekapcsolódnak. Amikor ilyen van, akkor mindig azt érzem, hogy valami rosszat csinálok. :)
Amíg saját gépen/helyi
Ha jól értem...
A role.fetch-et belövöm majd,
Na de legalább alakul a kép... Egyébként ha egyetlen config object-ben adok meg mindent, az is kb azonos az egyenkénti task hozzáadással. Még nem tudom, hogy a kettő közül melyik legyen... A rollback használat miatt a tranzakciós interface szimpatikusabb... Annyi a para vele, hogy mivel már van jelentése, ezért sokakban zavart kelthet...
Szerk: közben belegondoltam, hogy úgyis a komponens fogja vezérelni az egészet, úgyhogy elég config objectet megadni, vagy valami hasonlót...
Ez lett a vége:
Írtam egy kezdetleges
Példa a használatára: