Skip to content

Instantly share code, notes, and snippets.

@runspired
Last active September 17, 2016 06:29
Show Gist options
  • Save runspired/847601d7383bc60052b4 to your computer and use it in GitHub Desktop.
Save runspired/847601d7383bc60052b4 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>
{{test-container}}
{{outlet}}
<br>
<br>
import Ember from 'ember';
export default Ember.Component.extend({
});
<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 handler}}>
Layer 4 (click me)
</div>
</div>
</div>
</div>
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;
}
import Ember from 'ember';
const jQuery = Ember.$;
function makeListener(name, context) {
return function(e) {
if (e.target.tagName !== 'BUTTON') {
context.get('clickStack').pushObject({ title: name});
Ember.run.debounce(context, context.send, 'reset', 250);
}
return true;
};
}
export default Ember.Component.extend({
clickStack: null,
lastStack: null,
currentStack: null,
captureListener: null,
bubbleListener: null,
jQueryListener: null,
captureWindowListener: null,
bubbleWindowListener: null,
didInsertElement() {
this._super();
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._super();
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.captureWindowListener, true);
document.body.removeEventListener('click', this.bubbleWindowListener, false);
jQuery(element).off('click.demo');
},
actions: {
triggerClick() {
jQuery('#layer4').click();
},
iTooWasClicked() {
this.get('clickStack')
.pushObject({ title: 'jquery-on-app (component.click)'});
},
iWasClicked() {
this.get('clickStack').pushObject({ title: 'native onclick'});
},
reset() {
this.set('lastStack', this.get('currentStack'));
this.set('currentStack', this.get('clickStack'));
this.set('clickStack', Ember.A());
}
},
init() {
this._super();
this.set('clickStack', Ember.A());
this.set('lastStack', Ember.A());
this.set('currentStack', Ember.A());
}
});
<button {{action "triggerClick"}}>Trigger Click with jQuery().trigger</button>
<button {{action "reset"}}>Reset</button>
<br>
<hr>
<br>
{{click-test
click=(action "iTooWasClicked")
handler=(action "iWasClicked")
}}
<table>
<thead>
<tr>
<th>Current Run</th>
<th>Last Run</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<ol>
{{#each currentStack as |click|}}
<li>{{click.title}}</li>
{{/each}}
</ol>
</td>
<td>
<ol>
{{#each lastStack as |click|}}
<li>{{click.title}}</li>
{{/each}}
</ol>
</td>
</tr>
</tbody>
</table>
{
"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