Skip to content

Instantly share code, notes, and snippets.

@alexspeller
Forked from runspired/application.controller.js
Created November 10, 2015 21:17
Show Gist options
  • Save alexspeller/7183e3c02be452af8f79 to your computer and use it in GitHub Desktop.
Save alexspeller/7183e3c02be452af8f79 to your computer and use it in GitHub Desktop.
Event Complexities
import Ember from 'ember';
export default Ember.Controller.extend({
appName:'Ember Twiddle'
});
<h1>Event Complexities</h1>
{{click-test}}
{{outlet}}
<br>
<br>
import Ember from 'ember';
const jQuery = Ember.$;
function makeListener(name, context) {
return function() {
console.log('CALLBACK: ' + name);
context.get('clickStack').push(name);
return true;
};
}
export default Ember.Component.extend({
clickStack: null,
captureListener: null,
bubbleListener: null,
jQueryListener: null,
captureWindowListener: null,
bubbleWindowListener: null,
click() {
console.log('A CLICK');
this.get('clickStack').push('jquery-on-app (component.click)');
},
didInsertElement() {
this.setupListeners();
},
setupListeners() {
let element = this.$().find('#layer4').get(0);
this.captureListener = makeListener('capture-on-layer-4', this);
this.bubbleListener = makeListener('bubble-on-layer-4', this);
this.captureWindowListener = makeListener('capture-on-window', this);
this.bubbleWindowListener = makeListener('bubble-on-window', this);
this.jQueryListener = makeListener('jquery-on-layer-4', this);
element.addEventListener('click', this.captureListener, true);
element.addEventListener('click', this.bubbleListener, false);
document.body.addEventListener('click', this.captureWindowListener, true);
document.body.addEventListener('click', this.bubbleWindowListener, false);
jQuery(element).on('click.demo', this.jQueryListener);
},
willDestroyElement() {
this.teardownListeners();
},
teardownListeners() {
let element = this.$().find('#layer4').get(0);
element.removeEventListener('click', this.captureListener, true);
element.removeEventListener('click', this.bubbleListener, false);
document.body.removeEventListener('click', this.windowCaptureListener, true);
document.body.removeEventListener('click', this.windowBubbleListener, false);
jQuery(element).off('click.demo');
},
actions: {
triggerClick() {
this.set('clickStack', []);
jQuery('#layer4').click();
},
iWasClicked() {
this.get('clickStack').pushObject('native onclick');
},
reset() {
this.set('clickStack', []);
}
},
init() {
this._super();
this.set('clickStack', []);
}
});
<button {{action "triggerClick"}}>Trigger Click with jQuery().trigger</button>
<button {{action "reset"}}>Reset</button>
<br>
<hr>
<br>
<div id="layer1" class="layer red">
Layer 1
<div id="layer2" class="layer blue">
Layer 2
<div id="layer3" class="layer green">
Layer 3
<div id="layer4" class="layer white" onclick={{action "iWasClicked"}}>
Layer 4 (click me)
</div>
</div>
</div>
</div>
<ul>
{{#each clickStack as |click|}}
<ol>{{click}}</ol>
{{/each}}
</ul>
body {
margin: 12px 16px;
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
font-size: 12pt;
}
.layer {
border: 2px solid;
padding: 10px;
}
.white {
background: #fff;
color: #000;
}
.blue {
background: #2f44bf;
}
.green {
background: #2fbf44;
}
.red {
background: #bf2f44;
}
{
"version": "0.4.16",
"EmberENV": {
"FEATURES": {}
},
"dependencies": {
"jquery": "https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.3/jquery.js",
"ember": "https://cdnjs.cloudflare.com/ajax/libs/ember.js/2.1.0/ember.debug.js",
"ember-data": "https://cdnjs.cloudflare.com/ajax/libs/ember-data.js/2.1.0/ember-data.js",
"ember-template-compiler": "https://cdnjs.cloudflare.com/ajax/libs/ember.js/2.1.0/ember-template-compiler.js"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment