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);
|
|
},
|
|
});
|