ember-prefetch
ember-prefetch copied to clipboard
In prefetch, transition.params is not fully populated when a parent model was provided to the transition
Let's say you have a router setup like the following...
Router.map(function() {
this.resource('students', function() {
// This middle part of the URL is an ID that represents a student.
this.resource('student', { path: ':student_id' }, function() {
this.route('milestones');
});
});
});
Now, in your milestones route, you use prefetch as follows:
prefetch(params, transition) {
let studentId = transition.params.student.student_id;
// return some data fetch that depends on studentId
}
When the page loads from scratch, eg. at a URL like mysite.com/students/1234/milestones, then everything works fine. It also works fine when doing a manual transition and passing in the student ID, like this:
this.transitionTo('student.milestones', studentId);
But when we initiate the transition and pass the student model (in certain cases we already have it):
this.transitionTo('student.milestones', student);
... then we run into a problem in the milestones prefetch hook. Specifically, transition.params.student
isn't populated, so our data fetch doesn't work. We've had to work around this by doing the following in prefetch
:
let studentId = transition.params.student.student_id || transition.intent.contexts[0].id;
... which obviously is very fragile and relies on internal Ember structures.
So seems like a bug that we can't always get the student ID from transition.params
.
Have you tried using this.paramsFor('student').student_id
to retrieve the student_id
parameter? I'm not familiar with accessing other routes' dynamic segments via the transition object, but I have a feeling it's not public API.
Good idea, but unfortunately that doesn't work either. this.paramsFor('student')
is empty in prefetch()
when the transition was passed a student object.
I wonder if the serialize
method is run before or after the prefetch
hook. This is definitely something I haven't looking into before, so might need some change to support.
I believe (in my example) the student route's serialize
is run before the prefetch
hook. But somehow the URL parameter returned in that serialize
call is not making it to the prefetch arguments.