Skip to content

Instantly share code, notes, and snippets.

@raido
Last active August 23, 2016 09:22
Show Gist options
  • Save raido/edb37b04d60fbcd8d63c75cabee081c1 to your computer and use it in GitHub Desktop.
Save raido/edb37b04d60fbcd8d63c75cabee081c1 to your computer and use it in GitHub Desktop.
Ember Route Multiple Model Mixin
import Ember from 'ember';
import RouteRequiredModelsMixin from '../mixins/route-required-models';
export default Ember.Route.extend(RouteRequiredModelsMixin, {
// Hash values from here will be directly set on the controller
requiredModels(resolvedModel, transition) {
return {
books: this.store.findAll('books')
}
},
// for looking up up parent route requiredModels use
// this.requiredModelsFor('my-route'), just like this.modelFor()
});
import Ember from 'ember';
const { RSVP, getOwner } = Ember;
export default Ember.Mixin.create({
/**
* Use this method to define additional models your route requires
*
* @example
* return {
* groups: this.store.findAll('group'),
* ...
* }
*
* @public
* @return {Object}
*/
requiredModels(/*model, transition*/) {
return {};
},
/**
* Use this to lookup parent route additional models
*
* @public
* @param {String} name
* @return {Mixed}
*/
requiredModelsFor(name) {
let route = getOwner(this).lookup(`route:${name}`);
return route && route.get('__resolvedRequiredModels');
},
/**
* This method initialized RSVP for the hash returned from requiredModels method
*
* @private
* @param {Model} model
* @param {Transition} transition
* @return {Promise}
*/
_initializeRequiredModels(model, transition) {
let hash = this.requiredModels(model, transition);
if (Object.keys(hash).length > 0) {
return new RSVP.hash(hash).then((resolvedModels) => {
this.set('__resolvedRequiredModels', resolvedModels);
});
}
},
/**
* Initialize additional models query to API and wait for it
*
* @public
* @Ember
* @param {Model} model
* @param {Tansition} transition
* @return {Promise}
*/
afterModel(model, transition) {
return this._initializeRequiredModels(model, transition);
},
/**
* Finally when setupController is called, setup models from hash to controller
*
* @public
* @Ember
* @param {Controller} controller
*/
setupController(controller) {
this._super(...arguments);
let models = this.get('__resolvedRequiredModels');
if (models) {
controller.setProperties(models);
}
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment