Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
    <input type="text" id="a-text">
    +
    <input type="text" id="b-text">
    =
    <input type="text" id="c-text" readonly>
</body>
</html>
 
function observable(value) {
  var listeners = [];
  function notify(newValue) {
    listeners.forEach(function(listener){ listener(newValue); });
  }
  function accessor(newValue) {
    if (arguments.length && newValue !== value) {
      value = newValue;
      notify(newValue);
    }
    return value;
  }
  accessor.subscribe = function(listener) { listeners.push(listener); };
  return accessor;
}
function computed(calculation, dependencies) {
  var value = observable(calculation());
  function listener(v) {value(calculation()); }
  dependencies.forEach(function(dependency) {
    dependency.subscribe(listener);
  });
  function getter() { return value(); }
  getter.subscribe = value.subscribe;
  return getter;
}
function bindValue(input, observable) {
  var initial = observable();
  input.value = initial;
  observable.subscribe(function(){ input.value = observable(); });
  var converter = function(v) { return v; };
  if (typeof initial == 'number') {
    converter = function(n){ return isNaN(n = parseFloat(n)) ? 0 : n; };
  }
  input.addEventListener('input', function() {
    observable(converter(input.value));
  });
}
var aText = document.getElementById('a-text');
var bText = document.getElementById('b-text');
var cText = document.getElementById('c-text');
var a = observable(3), b = observable(2);
var c = computed(function(){ return a() + b(); }, [a, b]);
bindValue(aText, a);
bindValue(bText, b);
bindValue(cText, c);
Output

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
anonymouspro
0viewers