Skip to content
This repository has been archived by the owner on Mar 13, 2018. It is now read-only.

Commit

Permalink
Support binding to events
Browse files Browse the repository at this point in the history
  • Loading branch information
rafaelw committed Dec 22, 2013
1 parent 2f909f6 commit 5030c46
Show file tree
Hide file tree
Showing 2 changed files with 99 additions and 0 deletions.
39 changes: 39 additions & 0 deletions src/NodeBind.js
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,46 @@
};
}

function isEventHandler(name) {
return name[0] === 'o' &&
name[1] === 'n' &&
name[2] === '-';
}

function eventBinding(el, name, value, oneTime) {
var eventType = name.substring(3);
if (oneTime) {
el.addEventListener(eventType, value);
return;
}

var observable = value;
unbind(el, name);
function eventHandler() {
var fn = observable.discardChanges();
fn.apply(this, arguments);
}

el.addEventListener(eventType, eventHandler);

var capturedClose = observable.close;
observable.close = function() {
if (!capturedClose)
return;
el.removeEventListener(eventType, eventHandler);

observable.close = capturedClose;
observable.close();
capturedClose = undefined;
}

return el.bindings[name] = observable;
}

Element.prototype.bind = function(name, value, oneTime) {
if (isEventHandler(name))
return eventBinding(this, name, value, oneTime);

var conditional = name[name.length - 1] == '?';
if (conditional) {
this.removeAttribute(name);
Expand Down
60 changes: 60 additions & 0 deletions tests/tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,66 @@ suite('Element attribute bindings', function() {
});
});

suite('Element event bindings', function() {
test('Basic', function() {
var element = testDiv.appendChild(document.createElement('div'));
var fooCount = 0;
var barCount = 0;
var model = {
fooHandler: function() {
fooCount++;
}
};

var binding = element.bind('on-foo', new PathObserver(model, 'fooHandler'));
Platform.performMicrotaskCheckpoint();
dispatchEvent('foo', element);
assert.strictEqual(fooCount, 1);
assert.strictEqual(barCount, 0);

model.fooHandler = function() {
barCount++;
}

Platform.performMicrotaskCheckpoint();
dispatchEvent('foo', element);
assert.strictEqual(fooCount, 1);
assert.strictEqual(barCount, 1);

binding.close();
dispatchEvent('foo', element);
assert.strictEqual(fooCount, 1);
assert.strictEqual(barCount, 1);

});

test('Basic - oneTime', function() {
var element = testDiv.appendChild(document.createElement('div'));
var fooCount = 0;
var barCount = 0;
var model = {
fooHandler: function() {
fooCount++;
}
};

var binding = element.bind('on-foo', model.fooHandler, true);
Platform.performMicrotaskCheckpoint();
dispatchEvent('foo', element);
assert.strictEqual(fooCount, 1);
assert.strictEqual(barCount, 0);

model.fooHandler = function() {
barCount++;
}

Platform.performMicrotaskCheckpoint();
dispatchEvent('foo', element);
assert.strictEqual(fooCount, 2);
assert.strictEqual(barCount, 0);
});
});

suite('Form Element Bindings', function() {

setup(doSetup);
Expand Down

0 comments on commit 5030c46

Please sign in to comment.