Runtime vytvaranie mnozstva funkcii v slucke – JavaScript, AJAX, jQuery – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Runtime vytvaranie mnozstva funkcii v slucke – JavaScript, AJAX, jQuery – Fórum – Programujte.comRuntime vytvaranie mnozstva funkcii v slucke – JavaScript, AJAX, jQuery – Fórum – Programujte.com

 

Prog.0
Věrný člen
15. 5. 2007   #1
-
0
-

potrebujem objektu vytvorit mnozstvo metod, ktore budu vsetky robit "to iste", napriklad:

o = {};

o.metoda1 = function(parameter) { if (typeof this._metoda1 == 'function') this._metoda1(parameter) };
o.metoda2 = function(parameter) { if (typeof this._metoda2 == 'function') this._metoda2(parameter) };
...

rucne vypisovat to nechcem tak som na to siel takto:
var mtds = ['metoda1','metoda2','metoda3'];

for(var i=0;i<mtds.length;i++)
{
var method = '_' + mtds[i];
o[mtds[i]] = function(param)
{
if (typeof this[method] == 'function') this[method](param);
}
}


Takto to ale nefunguje, lebo potom, pri volani sa stale pouzije posledny method zo slucky.
(vsetky volania o.method1(), o.method2(), o.method3() volaju o._method3())

...tak som to hodil do funkcie, ktorej ten method predavam a ta fciu vytvory. Takto to funguje:
o.vytvor = function(method)

{
return function(param)
{
if (typeof this[method] == 'function') this[method](param);
}
}

for(var i=0;i<mtds.length;i++)
{
var method = '_' + mtds[i];
o[mtds[i]] = o.vytvor(method);
}

delete o.vytvor; // uz nieje potrebna



1. Chcem sa opytat, ci niekto nepozna riesenie bez tej pomocnej fcie, alebo ine, jednoduchsie

2. Dalsia otazka, iba ciste teoreticka, keby som chcel predavat neobmedzeny pocet parametrov ( o.method1('a',b','c') zavola o._method1('a','b','c') ) -- ci na to existuje nejaka jednoducha cesta, ina ako
eval('this[method]('+ ...spracovane arguments[] do stringu... +')');

Nahlásit jako SPAM
IP: ...–
Prog.
15. 5. 2007   #2
-
0
-

Nemas lepsi rict k cemu to potrebujes? Mam pocit, ze neni uloha, na kterou bys takovou prasarnu potreboval. Vzdy by to melo jit vyresit normalni smyckou nebo pres anonymni funkce.

Nahlásit jako SPAM
IP: ...–
Prosím, jestli potřebujete s něčím poradit,zeptejte se na fóru. Jakýkoliv bezdůvodný pokus mě kontaktovat skončí okamžitým přidáním do ignore listu![br][br] Současný počet osob, které to nepochopily: 7
Prog.0
Věrný člen
16. 5. 2007   #3
-
0
-

Objektovy model frameforku

Mam tam napr. objekt "textbox" ktory dedi <- "control" a ten dalsie (teraz nepodstatne)

ked sa vytvara novy textbox tak si jeho constructor vytvori this.el_input = document.createElement('input'); a nastavuje sa mu kadeco...

v kode to vyzera vytvorenie asi takto:

form1.controls.add('txtPokus')


a teraz chcem priradzovat objektu eventy takto:
form1.controls.txtPokus.onclick = function()

{ /* uzivatelska fcia pri clicknuti na textbox */ }


a na to potrebujem vsetky eventy z txtPokus.el_input.event prelinkovat na txtPokus.event, ale okrem toho, chcem aby sa volali aj eventy dedenych objektov.

Preto nastavujem .txtPokus.el_input.onclick = function(e) { .txtPokus._onclick(e) }; (nemozem pouzit iba txtPokus.el_input.onclick= txtPokus.onclick, lebo sa potom meni referencia na this)

ta fcia je zadefinovana v control.prototype
control.prototype._onclick = function(e)

{
if (typeof this._onclick1 == "function") this._onclick1(e)
// toto sa tyka jednotlivych controlsov, napr. textbox ma: textbox.prototype._onchange1
// je jedna vnutorna fcia na spraccovanie eventov textboxu

if (typeof this.onclick == "function") this.onclick(e)
// toto sa tyka prave uzivatelsky zadefinovanych eventov.
// User vytvori txt = form1.controls.add('txtPokus'); a potom ma moznost definovat:
// txt.onclick = function() { uzivatelova funkcia }
}


teraz takto potrebujem "prelinkovat" vsetky eventy. Ide o to, ze keby sa to tykalo iba toho textboxu... ale ine controls maju vo vnutri ine objekty tak, to rucne linkovat je nahlavu...

Zatial mi to slape s tou pomocnou fciou, je to na par riadkov, a usetrenych odhadujem niekolko stoviek... o prehladnosti nehovorim...

Ak by ma medzicasom osvietilo tak by som to zamozrejme rad prestaval, ale nemam ani len sajnu ako...

Nahlásit jako SPAM
IP: ...–
Prog.
Prog.0
Věrný člen
28. 6. 2007   #4
-
0
-

Jo, ja len ze som sa - co sa tyka javascriptu - naucil nieco nove, co sa dalo pouzit prave v tomto probleme, tak sa chcem pochvalit:

Podstatou problemu bola absencia block-scope v javascripte. Potreboval som cyklicky nadefinovat niekolko fukncii, a v nich sa odvolavat na iterator:

var pole = [];

for(var i=0;i<10;i++)
{
pole[i] = function()
{
alert('hodnota i = '+i);
}
}


teraz ak zavolam funkciu pole[0]() alebo pole[9]() stale vyhodi to iste ('hodnota i = 10')

take neohrabane riesenie je v prvom poste tohto vlakna, je na to potrebne definovanie dalsej fcie. Prisiel som na to, ze rozsirit scope premmennej ide aj cez anonymnu funkciu:
var pole = [];

for(var i=0;i<10;i++)
{
pole[i] = (function(i) {
return function()
{
alert('hodnota i = '+i);
}
})(i);
}


Ak je potrebne len block scope v javascripte, ide to takto:
var i = 1; 


(function(){

var i = 2;
alert('i = '+i); // vyhodi 2

})();

alert('i = '+i); // vyhodi 1


Dufam ze to niekomu niekedy pomoze. Enjoy ;-)


Nahlásit jako SPAM
IP: ...–
Prog.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

Podobná vlákna

Runtime error 64736 — založil Kalgys

Access 2010 Runtime — založil Lubos

Otvorenie pdf cez Runtime — založil vlado0991

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý