Ik heb twee objecten die naar elkaar luisteren. Als object A verandert, moet er iets in object B gebeuren; verandert er iets in B, dan moet er ook iets in A gebeuren.
Simpele voorstelling van zaken:
(objA en objB zijn gekoppeld aan twee user interface componenten, die beide door de gebruiker bediend kunnen worden).
Wat ik nu wil is dat 'this.onChange(val);' alleen aangeroepen wordt zodra de gebruiker iets verandert in de gerelateerde user interface component, en niet zodra de functie call van het andere object afkomstig is.
Dat kan natuurlijk eenvoudig met een extra parameter:
Maar misschien weten jullie een elegantere oplossing...?
P.S. De oplettende lezer zal merken dat "if (this.val==val) return;" in principe al een beveiliging is tegen een oneindige loop, maar in de praktijk verandert val - door afronding - steeds met een infinitesimale hoeveeldheid.
Simpele voorstelling van zaken:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| /* object A */ objA.setSomeValue = function(val){ if (this.val==val) return; this.val=val; this.onChange(val); } objA.onChange = function(val){ objB.setSomeValue(val) } /* Object B */ objB.setSomeValue = function(val){ if (this.val==val) return; this.val=val; } objB.onChange = function(val){ objA.setSomeValue(val); } |
(objA en objB zijn gekoppeld aan twee user interface componenten, die beide door de gebruiker bediend kunnen worden).
Wat ik nu wil is dat 'this.onChange(val);' alleen aangeroepen wordt zodra de gebruiker iets verandert in de gerelateerde user interface component, en niet zodra de functie call van het andere object afkomstig is.
Dat kan natuurlijk eenvoudig met een extra parameter:
JavaScript:
1
2
3
4
5
6
7
8
9
10
| /* object A */ objA.setSomeValue = function(val, byUser){ if (this.val==val) return; this.val=val; if (byUser) { this.onChange(val); } } |
HTML:
1
| <button onclick="objA.setSomeValue(this.value, true)"></button> |
Maar misschien weten jullie een elegantere oplossing...?
P.S. De oplettende lezer zal merken dat "if (this.val==val) return;" in principe al een beveiliging is tegen een oneindige loop, maar in de praktijk verandert val - door afronding - steeds met een infinitesimale hoeveeldheid.