Heren (en eventueel aanwezige dames)
Ik ben bezig een simpel event handling ding te maken in JS, echter als ik een callback functie defineer, en ik refereer daarin aan 'this' dan is dat de vekeerde.
Het is zo dat ik twee objecten heb, laten we zeggen een form en een field.
de formulier voegt een veld toe, en het veld heeft een event 'datachanged'
ik heb het nu zo (testcase)
nu gaat mijn event netjes af, en krijg ik ook een alert, echter is dat niet met de juiste tekst.
Ik had verwacht "Ik ben een voorbeeld" te zien te krijgen, maar ik krijg helaas "ik ben een Veld!! mwhahahah" te zien.
Mijn referentie naar 'this' is dus een verwijzing naar een instantie van 'veld', en niet van 'formulier'.
Hoe fix ik dat?
Ik ben bezig een simpel event handling ding te maken in JS, echter als ik een callback functie defineer, en ik refereer daarin aan 'this' dan is dat de vekeerde.
Het is zo dat ik twee objecten heb, laten we zeggen een form en een field.
de formulier voegt een veld toe, en het veld heeft een event 'datachanged'
ik heb het nu zo (testcase)
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
65
66
67
68
69
70
71
| <html> <head> <script type="text/javascript"> function Formulier() { this.blaat = 'Ik ben een voorbeeld'; this.doeIets = function() { alert(this.blaat); } this.veld = new Veld(); this.veld.addListener('datachanged', this.doeIets); this.veld.fire('datachanged'); return this; } function Veld() { this.blaat = "ik ben een Veld!! mwhahahah" this._listeners = {}; this.addListener = function(type, listener) { if (typeof this._listeners[type] == "undefined") { this._listeners[type] = []; } this._listeners[type].push(listener); } this.removeListener = function(type, listener) { if (this._listeners[type] instanceof Array) { var listeners = this._listeners[type]; for (var i = 0, len = listeners.length; i < len; i++) { if (listeners[i] === listener) { listeners.splice(i, 1); break; } } } } this.fire = function(event) { if (typeof event == "string") { event = { type: event }; } if (!event.target) { event.target = this; } if (!event.type) { //falsy throw new Error("Event object missing 'type' property."); } if (this._listeners[event.type] instanceof Array) { var listeners = this._listeners[event.type]; for (var i = 0, len = listeners.length; i < len; i++) { listeners[i].call(this, event); } } } return this; } </script> </head> <body> <script type="text/javascript"> var form = new Formulier(); </script> </body> </html> |
nu gaat mijn event netjes af, en krijg ik ook een alert, echter is dat niet met de juiste tekst.
Ik had verwacht "Ik ben een voorbeeld" te zien te krijgen, maar ik krijg helaas "ik ben een Veld!! mwhahahah" te zien.
Mijn referentie naar 'this' is dus een verwijzing naar een instantie van 'veld', en niet van 'formulier'.
Hoe fix ik dat?
[ Voor 44% gewijzigd door BasieP op 24-02-2011 13:03 ]
This message was sent on 100% recyclable electrons.