When using the aurelia.io framework router, what is the preferred method for reading and setting a query string?
For example, in the url: http://www.myapp.com/#/my
On viewmodel you can implement method activate(params, routeConfig) and object params should contain your query variables
activate(params, routeConfig){
console.log(params.s); //should print mystate
}
To navigate to some route, you have to specify the name of this route in app.js (name: 'redirect')
config.map([
{ route: ['','welcome'], moduleId: './welcome', nav: true, title:'Welcome' },
{ route: 'flickr', moduleId: './flickr', nav: true, title:'Flickr' },
{ route: 'redirect', moduleId: './redirect', name: 'redirect'},
{ route: 'child-router', moduleId: './child-router', nav: true, title:'Child Router' }
]);
and then use method NavigateToRoute with parameters.
router.navigateToRoute('redirect', { s:'mystate'}, {replace: true});
As per the latest configuration, the query string will not be retrieved if you didn't set the push state.
Set push state to true. and add base tag in index.html.
<base href="http://localhost:9000/">
- index.html
config.options.pushState = true;
- app.js -> configureRouter method.
If you want to change queryParams
and reload page with it (e.g. change page number on pagination link click) -- you must use determineActivationStrategy
with replace
.
Create view model and add determineActivationStrategy
function:
import {activationStrategy} from 'aurelia-router';
export class ModelView{
determineActivationStrategy() {
return activationStrategy.replace;
}
}
Add activate event to your model for saving params:
activate(params, routeConfig, navigationInstruction){
this.queryParams = params ? params : {};
}
Add code for reload or navigate with same or new parameters:
moveToNewPage(newPageNumber){
this.queryParams.page = newPageNumber; // change page param to new value
this.router.navigateToRoute(this.router.currentInstruction.config.name, this.queryParams);
}
P.S. for this.router
access use inject and don't forget to set name
of router in app configuration:
import {Router} from 'aurelia-router';
export class ModelView{
static inject() { return [Router] };
constructor(router){
this.router = router;
}
}