Skip to content

Instantly share code, notes, and snippets.

@danmcclain
Last active February 19, 2016 22:09
Show Gist options
  • Save danmcclain/8ca7a5edd5ab0df72c0c to your computer and use it in GitHub Desktop.
Save danmcclain/8ca7a5edd5ab0df72c0c to your computer and use it in GitHub Desktop.
Ember-deferred-content
import Ember from 'ember';
const { RSVP } = Ember;
export default Ember.Controller.extend({
promise: null,
resolve: null,
reject: null,
init() {
this._super(...arguments);
this.setupPromise();
},
setupPromise() {
let deferred = RSVP.defer();
this.set('promise', deferred.promise);
this.set('resolve', deferred.resolve);
this.set('reject', deferred.reject);
},
actions: {
resetPromise() {
this.setupPromise();
},
resolvePromise() {
this.get('resolve')('Some stuff from the resolved promise');
},
rejectPromise() {
this.get('reject')('Some reason from reject');
}
}
});
<h1>ember-deferred-content example</h1>
<button {{action "resetPromise"}}>Reset Promise</button>
<br>
<button {{action "rejectPromise"}}>Reject Promise</button>
<br>
<button {{action "resolvePromise"}}>Resolve Promise</button>
<br>
{{#deferred-content promise=promise as |d|}}
{{#d.settled}}<h2>Your content!</h2>{{/d.settled}}
{{#d.pending}}Loading your content...{{/d.pending}}
{{#d.rejected as |reason|}}<strong>Could not load your content:</strong> {{reason}}{{/d.rejected}}
{{#d.fulfilled as |stuff|}}<strong>Loaded:</strong> {{stuff}}{{/d.fulfilled}}
{{/deferred-content}}
import Ember from 'ember';
const {
Component,
computed,
set
} = Ember;
export default Component.extend({
promise: computed({
set(key, promise) {
set(this, 'isFulfilled', false);
set(this, 'result', null);
promise.then((result) => {
set(this, 'isFulfilled', true);
set(this, 'result', result);
return result;
});
return promise;
}
})
});
{{#if isFulfilled}}{{yield result}}{{/if}}
import Ember from 'ember';
const {
Component,
computed,
set
} = Ember;
export default Component.extend({
promise: computed({
set(key, promise) {
set(this, 'isSettled', false);
promise.finally(() => {
set(this, 'isSettled', true);
});
return promise;
}
})
});
{{#unless isSettled}}{{yield}}{{/unless}}
import Ember from 'ember';
const {
Component,
computed,
set
} = Ember;
export default Component.extend({
promise: computed({
set(key, promise) {
set(this, 'isRejected', false);
set(this, 'result', null);
promise.catch((result) => {
set(this, 'isRejected', true);
set(this, 'result', result);
});
return promise;
}
})
});
{{#if isRejected}}{{yield result}}{{/if}}
import Ember from 'ember';
const {
Component,
computed,
set
} = Ember;
export default Component.extend({
promise: computed({
set(key, promise) {
set(this, 'isSettled', false);
promise.finally(() => {
set(this, 'isSettled', true);
});
return promise;
}
})
});
{{yield (hash pending=(component 'deferred-content/pending-content' promise=promise)
fulfilled=(component 'deferred-content/fulfilled-content' promise=promise)
rejected=(component 'deferred-content/rejected-content' promise=promise)
settled=(component 'deferred-content/settled-content' promise=promise)
)
}}
{
"version": "0.5.3",
"EmberENV": {
"FEATURES": {}
},
"options": {
"enable-testing": false
},
"dependencies": {
"jquery": "https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.3/jquery.js",
"ember": "https://cdnjs.cloudflare.com/ajax/libs/ember.js/2.3.1/ember.debug.js",
"ember-data": "https://cdnjs.cloudflare.com/ajax/libs/ember-data.js/2.3.3/ember-data.js",
"ember-template-compiler": "https://cdnjs.cloudflare.com/ajax/libs/ember.js/2.2.0/ember-template-compiler.js"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment