Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I set/read a query string when using the router in aurelia?

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/#/myroute1/?s=mystate

How do I read and set the ?s=mystate part of the url and have the aurelia router navigate correctly and remember that state, such that whenever I arrive in my route1 viewmodel I can read that state variable and do something with it?

like image 434
bedo Avatar asked Jun 15 '15 18:06

bedo


3 Answers

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});
like image 142
emilpytka Avatar answered Oct 11 '22 06:10

emilpytka


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;
  }
}
like image 43
JayDi Avatar answered Oct 11 '22 06:10

JayDi


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.

like image 1
Raja Avatar answered Oct 11 '22 06:10

Raja