Last active
August 23, 2016 09:22
-
-
Save raido/edb37b04d60fbcd8d63c75cabee081c1 to your computer and use it in GitHub Desktop.
Ember Route Multiple Model Mixin
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() | |
}); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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