Issue with getChangelist in Router.js
In Ember, while transitioning between routes, the function getChangelist is used to compare the state between transitions. You can find its implementation here:
The problem with this function is that, when comparing old and new queryParams, it mutates the parameters by stringifying them, which I believe should be immutable. The issue arises from this code:
For example, if the query parameters contain an array of objects, the result becomes ['[object Object]']. A current workaround to this problem is to avoid using arrays as values, as it wont get stringified by lack of cases in the stringifier function
Complex QueryParams Example:
In our Ember app, we use a complex structure for queryParams when transitioning between routes. For instance:
router.transitionTo('some.route', {
queryParams: {
reports: [
{
someData: 10,
}
]
}
})
However, we don't really map all this data to the URL, some of these is read and thats it.
class SomeRoute extends Route {
model(_, transition) {
const { to } = transition;
// Here, reports is an array of ['object object']
transition.to.reports.forEach(); // This will has an issue, all of the elements are now `['[object Object]']`
}
}
Observations:
-
Immutability: The parameters shouldn't be mutated at all, especially since it's only for comparison purposes. An alternative approach should be used.
-
Comparison Logic: When comparing objects, a more robust library like deepEquals or fastEquals should be used? Because there are too many edge cases that can't be properly handled by simply coercing values to strings.
Issue with
getChangelistin Router.jsIn Ember, while transitioning between routes, the function
getChangelistis used to compare the state between transitions. You can find its implementation here:getChangelistfunctionThe problem with this function is that, when comparing old and new
queryParams, it mutates the parameters by stringifying them, which I believe should be immutable. The issue arises from this code:getChangelistFor example, if the query parameters contain an array of objects, the result becomes
['[object Object]']. A current workaround to this problem is to avoid using arrays as values, as it wont get stringified by lack of cases in the stringifier functionComplex QueryParams Example:
In our Ember app, we use a complex structure for
queryParamswhen transitioning between routes. For instance:However, we don't really map all this data to the URL, some of these is read and thats it.
Observations:
Immutability: The parameters shouldn't be mutated at all, especially since it's only for comparison purposes. An alternative approach should be used.
Comparison Logic: When comparing objects, a more robust library like
deepEqualsorfastEqualsshould be used? Because there are too many edge cases that can't be properly handled by simply coercing values to strings.