Hi there,
i’ve got a tiny app up & running. Using ember-data, ember-simple-auth with oauth2 and a the ember-django-adapter.
One of my routes fetches some records from from the API & displays them in a table. On top of that table sits a wall containing a bunch of switches (debounced input fields, selects) to shrink the results from my query. Changing one of those switches adds some parameters to the URL & reloads the route, issuing a new (parametereized) query to the API & displays the result. Everything works great but it is pretty annoying that reloading the route always even reloads the wall so that I lose focus on my input field…
Reloading the route on parameter’s change is achieved with implementing
queryParamsDidChange: function () {
Ember.run.once(this, this.refresh);
}
in the route’s actions.
What would be the best approach to reload just the table? Must admit that I don’t get the concept of nested routes and I feel pretty much in jail of “convention over configuration” when it comes to the binding between models, controllers & routes…
Thanks in advance for helping & sorry for being stupid,
Martin
1 Like
Hi Martin,
If I understand correctly you are looking for something like https://www.emberaddons.com/ which does pagination and filtering with query params whilst keeping the focus?
That is open source so you could take a look at the project: GitHub - gcollazo/ember-cli-addon-search: This project is no longer maintained please visit Ember Observer to see exactly how they achieve that.
I haven’t looked at it but in all likelihood a “query” component setting a qp and a table component simply reacting to that newly loaded data.
Alternatively you could try loading data by way of a service (like here: Should Components Load Data? - Ember Igniter) although I am pretty sure that is not the right approach in this case.
Will you let us know how it goes?
I suppose that you fetch data in the route so you can define your query params to refreshModel when the value change. I copy the expmple from the guide toc_opting-into-a-full-transition
export default Ember.Route.extend({
queryParams: {
category: {
refreshModel: true
}
},
model(params) {
// This gets called upon entering 'articles' route
// for the first time, and we opt into refiring it upon
// query param changes by setting `refreshModel:true` above.
// params has format of { category: "someValueOrJustNull" },
// which we can just forward to the server.
return this.store.query('articles', params);
}
});
In this way you can delete queryParamsDidChange from your route and ember do the thing
I hope this could be useful
Alessandro
1 Like
Alessandro, this sounds absolutely reasonable, how could I miss it???
Will give it a try in a hour, thank you!
Martin
Guys, as far as I understand the result will be the same. I assumed Martin took that approach (queryParamsDidChange
) because he has many query params, since with queryParams
/refreshModel
you do that declaratively for each property at a time.
Anyway, let us know if you could fix it!
Yep, Frank is right. Did not work. Seems that I need to step back from query params to parameterize my query.
Regards,
Martin
Martin, were you able to get ideas from Ember Addons?
Hi Frank, nope - not yet. Decided to go snowboarding, trying to get all this crazy ember stuff out of my brain.
Martin
1 Like
Hey Frank, just wanted to let you know that I did not solve the technical problem but I vaporized the UX problem!
Simply by zapping the route_loading substates… See me clapping against my forehead.
Regards,
Martin