Skip to content

Commit 237ef58

Browse files
committed
Use existing add/removeEventListener for elements
This makes it possible to use can-define with HTML elements so that both property events and DOM events can be listened to and fire correctly. The method for doing this is to call to the existing `addEventListener` if one exists, otherwise to do the default action of calling to eventLifecycle.addAndSetup. Closes #145
1 parent 4fbb7eb commit 237ef58

File tree

3 files changed

+17
-9
lines changed

3 files changed

+17
-9
lines changed

can-define.js

+14-8
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ module.exports = define = ns.define = function(objPrototype, defines, baseDefine
8383
return data;
8484
});
8585

86+
// Add in the base event methods
87+
define.addBaseEvents(objPrototype);
88+
8689
// Add necessary event methods to this object.
8790
for (var prop in eventsProto) {
8891
Object.defineProperty(objPrototype, prop, {
@@ -280,7 +283,7 @@ make = {
280283
if (newVal !== current) {
281284
setData.call(this, newVal);
282285

283-
canEvent.dispatch.call(this, {
286+
canEvent.trigger.call(this, {
284287
type: prop,
285288
target: this
286289
}, [newVal, current]);
@@ -644,7 +647,6 @@ assign(eventsProto, {
644647
_eventSetup: function() {},
645648
_eventTeardown: function() {},
646649
addEventListener: function(eventName, handler) {
647-
648650
var computedBinding = this._computed && this._computed[eventName];
649651
if (computedBinding && computedBinding.compute) {
650652
if (!computedBinding.count) {
@@ -656,10 +658,7 @@ assign(eventsProto, {
656658

657659
}
658660

659-
var baseAddEventListener = this.__proto__.addEventListener ||
660-
eventLifecycle.addAndSetup;
661-
662-
return baseAddEventListener.apply(this, arguments);
661+
return this._baseEvents.addEventListener.apply(this, arguments);
663662
},
664663

665664
// ### unbind
@@ -678,8 +677,7 @@ assign(eventsProto, {
678677

679678
}
680679

681-
return eventLifecycle.removeAndTeardown.apply(this, arguments);
682-
680+
return this._baseEvents.removeEventListener.apply(this, arguments);
683681
}
684682
});
685683
eventsProto.on = eventsProto.bind = eventsProto.addEventListener;
@@ -721,6 +719,14 @@ define.setup = function(props, sealed) {
721719
};
722720
define.replaceWith = replaceWith;
723721
define.eventsProto = eventsProto;
722+
define.addBaseEvents = function(objPrototype){
723+
objPrototype._baseEvents = objPrototype.addEventListener &&
724+
objPrototype.addEventListener !== eventsProto.addEventListener ?
725+
{ addEventListener: objPrototype.addEventListener,
726+
removeEventListener: objPrototype.removeEventListener } :
727+
{ addEventListener: eventLifecycle.addAndSetup,
728+
removeEventListener: eventLifecycle.removeAndTeardown };
729+
};
724730
define.defineConfigurableAndNotEnumerable = defineConfigurableAndNotEnumerable;
725731
define.make = make;
726732
define.getDefinitionOrMethod = getDefinitionOrMethod;

list/list.js

+1
Original file line numberDiff line numberDiff line change
@@ -1056,6 +1056,7 @@ assign(DefineList.prototype, {
10561056

10571057

10581058
// Add necessary event methods to this object.
1059+
define.addBaseEvents(DefineList.prototype);
10591060
for (var prop in define.eventsProto) {
10601061
DefineList[prop] = define.eventsProto[prop];
10611062
Object.defineProperty(DefineList.prototype, prop, {

map/map.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ var setProps = function(props, remove) {
5656
}
5757
else if( ("replace" in curVal) && isArray(newVal)) {
5858
curVal.replace(newVal);
59-
}
59+
}
6060
else if( ("set" in curVal) && (isPlainObject(newVal) || isArray(newVal))) {
6161
curVal.set(newVal, remove);
6262
}
@@ -259,6 +259,7 @@ var DefineMap = Construct.extend("DefineMap",{
259259
});
260260

261261
// Add necessary event methods to this object.
262+
define.addBaseEvents(DefineMap.prototype);
262263
for(var prop in define.eventsProto) {
263264
DefineMap[prop] = define.eventsProto[prop];
264265
Object.defineProperty(DefineMap.prototype, prop, {

0 commit comments

Comments
 (0)