Skip to content

Instantly share code, notes, and snippets.

@mistahenry
Last active December 5, 2018 17:30
Show Gist options
  • Save mistahenry/d14b6b9725a2162ce91d951502571529 to your computer and use it in GitHub Desktop.
Save mistahenry/d14b6b9725a2162ce91d951502571529 to your computer and use it in GitHub Desktop.
Async actions, 1 way binding + runloop
import Ember from 'ember';
import { run } from '@ember/runloop';
export default Ember.Component.extend({
didInsertElement(){
this.set('currentIndex', 0);
this.set('currentNumber', this.numbers[this.currentIndex]);
},
actions: {
showNext(){
let index = this.currentIndex;
if(index === this.numbers.length - 1){
this.fetchNext().then((nextSet) => {
this.set('currentIndex', 0);
this.set('callbackNumbers', this.numbers.slice(0));
run.next(this, () => {
this.set('syncNumbers', this.numbers.slice(0));
});
this.set('currentNumber', this.numbers[this.currentIndex]);
});
}else{
this.set('currentIndex', this.currentIndex + 1);
this.set('currentNumber', this.numbers[this.currentIndex]);
}
}
}
});
import Ember from 'ember';
export default Ember.Controller.extend({
init(){
this.set('numbers', ["one","two","three"]);
},
appName: 'Ember Twiddle',
actions: {
fetchNext(){
return Ember.RSVP.resolve(["four", "five", "six"]).then((result) => {
this.set('numbers', result);
return result;
});
}
}
});
<p>In the following component, I have collection of numbers and a current index. With each press of the next button, I bump the index until I reach end of the page, at which point I fetch the next list and set the index back to zero.</p>
{{my-component numbers=numbers fetchNext=(action 'fetchNext')}}
{{currentNumber}}
<br>
<button {{action 'showNext'}}>Next</button>
<h5>Current Index</h5>
<p>{{currentIndex}}</p>
<h5>Current list</h5>
<ul>
{{#each numbers as |num|}}
<li>{{num}}</li>
{{/each}}
</ul>
<h5>List in callback</h5>
{{#each callbackNumbers as |num|}}
<li>{{num}}</li>
{{/each}}
<h5>List in callback after next runloop</h5>
{{#each syncNumbers as |num|}}
<li>{{num}}</li>
{{/each}}
{
"version": "0.15.1",
"EmberENV": {
"FEATURES": {}
},
"options": {
"use_pods": false,
"enable-testing": false
},
"dependencies": {
"jquery": "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js",
"ember": "3.4.3",
"ember-template-compiler": "3.4.3",
"ember-testing": "3.4.3"
},
"addons": {
"ember-data": "3.4.2"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment