[JS] variabel aanroepen van namespace functies

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • vorlox
  • Registratie: Juni 2001
  • Laatst online: 02-02-2022

vorlox

I cna ytpe 300 wrods pre miute

Topicstarter
Beste,

Ik ben aan het zoeken naar een manier om via een config variabel functies aan te roepen.
Maar zodra deze in een namspace zitten loop ik een beetje vast.

Ik heb een aantal functies alsvolgt opgebouwd
JavaScript:
1
2
3
4
5
6
MyNs.group.method1 = function () {
    /* do iets */
}
MyNs.group.method2 = function () {
    /* do iets */
}


Als ik deze nu hard wil aanroepen doe ik zoiets als
JavaScript:
1
MyNs.group.method1();


Dat werkt prima, echter als ik dit nu via bv een variabele wil aanroepen dan werkt dit niet.

JavaScript:
1
2
3
4
5
6
MyNs.group.run = function (methodName) {
    //Run
    window[methodName]();
}
//Waarbij ik stuur
MyNs.group.run('MyNs.group.method1');


Ik kan natuurlijk wel zoiets maken als een functie ref
dus
JavaScript:
1
2
3
4
5
6
MyNs.group.run = function (fnc) {
    //Run
    fnc();
}
//En dan sturen
MyNs.group.run(MyNs.group.method1);


Maar dat is net niet wat ik hier nodig heb omdat het als string wordt aangeleverd.
Eval is eigenlijk nooit een optie, dus die sla ik even over....kan altijd nog.

Moet ik nu iets gaan schrijven wat de string opsplitst via de "." en dan een soort loop maken om via
window[part1][part2]() enz de boel aan te roepen

of mis ik hier iets

Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 09:25
Of eval of een nieuwe Function object aanmaken :)
De pagina geeft trouwens aan dat het misschien niet werkt in IE, maar microsoft denkt daar anders over.

[ Voor 39% gewijzigd door Caelorum op 04-08-2011 09:53 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Eval kan best een optie zijn als je maar weet wanneer je hem toe moet passen. Je klinkt zo een beetje hetzelfde als iemand die denkt dat je absoluut nergens tables mag gebruiken in HTML en daarom tabulaire data stylet met divs. :P

Verder: Waar hoort mijn topic?

PRG>>WEB

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • vorlox
  • Registratie: Juni 2001
  • Laatst online: 02-02-2022

vorlox

I cna ytpe 300 wrods pre miute

Topicstarter
Getver ik zou zweren dat ik hem ook in PRG>>WEB had aangemaakt, maar klaarblijkelijk niet.
Mijn excuses..moet beter opletten in welke groep ik zit.
Verder weet ik idd dat eval kan...en als ik dat netjes beveilig is dat geen probleem, maar ik vroeg me af of ik iets over het hoofd zag.

Even zitten prutsen, lijkt wel wat te doen.
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
runNsMethod = function (methodName) { 
    //Var
    var parts = methodName.split('.'),
        i,
        l,
        fnc = window;
    //Count length
    l = parts.length;
    //Loop
    for (i = 0; i < l; i += 1) {
        fnc = fnc[parts[i]];
    }
    return fnc;
};

[ Voor 36% gewijzigd door vorlox op 04-08-2011 10:50 . Reden: kan niet typen ]


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 22-09 16:31
Waarom de method name als string en niet als reference meesturen? Waarom niet het object en de method name los van elkaar meesturen?

Wat je nu aan het doen bent is wel redelijk aan de houtje-touwtje-kant.

Verder, kijk eens naar call/apply.

[ Voor 17% gewijzigd door Bosmonster op 04-08-2011 10:52 ]


Acties:
  • 0 Henk 'm!

  • vorlox
  • Registratie: Juni 2001
  • Laatst online: 02-02-2022

vorlox

I cna ytpe 300 wrods pre miute

Topicstarter
Tja lang verhaal, ik heb +/- 10 methodes die vast zijn, maar net iets gebouwd waarmee je een extra JS bestand kunt laden waarin een custom functie kan zitten.
Die kun je dan vervolgens via een config meesturen en dat is dus een string.
Dus ik weet niet van te voren hoe die custom functie gaat heten.

Ok even voorbeeldje
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
runNsMethod = function (methodName) { 
    //Var
    var parts = methodName.split('.'),
        i,
        l,
        fnc = window;
    //Count length
    l = parts.length;
    //Loop
    for (i = 0; i < l; i += 1) {
        fnc = fnc[parts[i]];
    }
    return fnc;
};

//Standaard velden
MyNs.forms.textBox = function () {
    /* bouw veld */
    return obj;
};
MyNs.forms.numericBox = function () {
    /* bouw veld */
    return obj;
};
MyNs.forms.bitBox = function () {
    /* bouw veld */
    return obj;
};

//Custom veld
MyNs.forms.customVeld1 = function () {
    /* bouw veld */
    return obj;
};

//Cfg
var cfg = [
    { 'label' : 'Veld 1', 'type' : 'textBox', 'enz' : '' },
    { 'label' : 'Veld 2', 'type' : 'numericBox', 'enz' : '' },
    { 'label' : 'Veld 3', 'type' : 'bitBox', 'enz' : '' },
    { 'label' : 'Veld 4', 'type' : 'MyNs.forms.customVeld1', 'enz' : '' }
];

//Bouw velden
for (var i = 0; i < cfg.length; i += 1) {
    var fldCfg = cfg[i],
        fldObj,
        fldFnc;
    //Switch op bekende velden
    switch(fldCfg.type) {
    case 'textBox':
        fldObj = MyNs.forms.textBox();
        break;
    //enz
    default:
        fldFnc = runNsMethod(fldCfg.type);
        if (typeof fldFnc === 'function') {
            fldObj = fldFnc();
        } else {
            alert('Not implemented');
        }
        break;
    }
}


En het feit is nu dat die CFG wordt opgebouwd uit een database, dus ik krijg altijd een string, vandaar dat ik dit wil oplossen.
Hoop dat het duidelijk is

[ Voor 1% gewijzigd door vorlox op 04-08-2011 11:17 . Reden: Code wijziging anders klopte er niks van ]

Pagina: 1