eventbinding for json
by Richard Hunter
JavaScript
// constructor function
var Node = function (obj, parent) {
this.listeners = {};
if(parent) {
this.parent = parent;
}
if(typeof obj === 'object') {
this.children = {};
for(var prop in obj) {
this.children[prop] = new Node(obj[prop], this);
}
} else {
this.value = obj;
}
}
// register handler functions
Node.prototype.on = function (event, handler, context) {
if(!this.listeners[event]) {
this.listeners[event] = [];
}
this.listeners[event].push([handler, context]);
};
// fire method. calls fire method of parent node
Node.prototype.fire = function (event) {
var listeners = this.listeners[event];
if(listeners) {
for(var i = 0; i < listeners.length; i++) {
listeners[i][0].call(listeners[i][1]);
}
}
if(this.parent) {
this.parent.fire(event);
}
}
// set value of node. fire event
Node.prototype.set = function (newValue) {
if(this.value) {
var oldValue = this.value;
this.value = newValue;
this.fire("change");
} else {
throw {
name : "NonPrimitiveNodeException"
}
}
}
var foo = new Node({
bar : "bar",
dan : "dan",
eco : {
fruit : "banana",
veg : "carrot"
}
});
// set handler on root node
foo.on("change", function() {
console.log("changed fruit value");
});
// make change on a child node. root handler should be called.
foo.children['eco'].children['fruit'].set("pineapple");