tsunami

log in
history

Javascript Observer Pattern

Luke Breuer

function ObservedVariable(value)
{
    var _observers = [];

    this.GetValue = function GetValue()
    {
        return value;
    }
    
    this.SetValue = function SetValue(newValue)
    {
        if (value == newValue)
            return;
        
        value = newValue;
        
        for (var i = _observers.length - 1; i >= 0; i--)
        {
            if (_observers[i](this) === false)
                _observers.splice(i, 1);
        }
    }
    
    this.AddObserver = function AddObserver(observer)
    {
        _observers.push(observer);
    }
}


function Test()
{
    var ov = new ObservedVariable(1);
    
    WatchValue(ov);
    
    alert('Setting new value');
    
    ov.SetValue(42);
}

function WatchValue(ov)
{
    var someValue = 'hello';
    
    alert('About to start watching');
    
    ov.AddObserver(function(changedVariable)
    {
        alert('New value: ' + changedVariable.GetValue() + '  someValue: ' + someValue);
    });
}

Test();