47730f96ea
It's not obvious what "the way" to teardown window event handlers is in Ember. The datacenter-picker is permanently in the app during usage, but in tests I'm assuming it gets added and removed lots. So when you run the tests, as the tests aren't run in an isolated runner the QUnit test runner ends up with a click handler on it, So if you click on the test runner one of the tests will fail. The failure is related to there not being an element with a `.contains` method. So this checks that the element is truthy first, i.e. it exists. If it doesn't it just bails out.
38 lines
970 B
JavaScript
38 lines
970 B
JavaScript
import Mixin from '@ember/object/mixin';
|
|
|
|
import { next } from '@ember/runloop';
|
|
import { get } from '@ember/object';
|
|
const isOutside = function(element, e) {
|
|
if (element) {
|
|
const isRemoved = !e.target || !document.contains(e.target);
|
|
const isInside = element === e.target || element.contains(e.target);
|
|
return !isRemoved && !isInside;
|
|
} else {
|
|
return false;
|
|
}
|
|
};
|
|
const handler = function(e) {
|
|
const el = get(this, 'element');
|
|
if (isOutside(el, e)) {
|
|
this.onblur(e);
|
|
}
|
|
};
|
|
export default Mixin.create({
|
|
init: function() {
|
|
this._super(...arguments);
|
|
this.handler = handler.bind(this);
|
|
},
|
|
onchange: function() {},
|
|
onblur: function() {},
|
|
didInsertElement: function() {
|
|
this._super(...arguments);
|
|
next(this, () => {
|
|
document.addEventListener('click', this.handler);
|
|
});
|
|
},
|
|
willDestroyElement: function() {
|
|
this._super(...arguments);
|
|
document.removeEventListener('click', this.handler);
|
|
},
|
|
});
|