Route Reload Handling Failures (RSVP.hash for model)


#1

I periodically call .refresh() on my route as I am not using Ember data but instead rely on RSVP.hash.

This allows me pretend that my application is autoreloading and works fine until the backend goes down and a failure occurs.

This causes an exception to be propagated to the frontend and makes the frontend enter an error state.

How do I use the old model before a reload if the reload fails? I have tried using a try/catch on the .refresh() call but this does not appear to make a difference.

Thanks!


#2

correct method is .refresh. Please refer http://emberjs.com/api/classes/Ember.Route.html#method_refresh


#3

Thanks Elisha, sorry that was my mistake. I meant refresh() and opposed to reload(). However, this issue still stands with refresh().


#4

One possible approach would be:

  1. implement beforeModel() hook and store current model as data in transition. Refer http://emberjs.com/api/classes/Transition.html#property_data
  2. implement error action for handling error events, and in reset the model from transition object. Refer https://guides.emberjs.com/v2.11.0/routing/loading-and-error-substates/#toc_the-code-error-code-event

#5

Thanks Elisha, super helpful. A quick followup: does beforeModel have access to the model with the promises already resolved? For instance, if I do transition.data = this.model, I would only get access to the model method and I don’t believe I can just call this.model() at that point in the lifecycle.


#6

model property is set in route’s controller after successful resolution of the model from model() hook.

so, your route code would be like:

beforeModel(transition) {
   transition.data = this.get('controller').get('model');
},

model() {
  //return promise
},

actions : {
   error : function(error, transition) {
      //set controller model = transition.data
   }
}