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");