
Routing is a new feature in Ext JS 5 that allows you to associate navigation history with a controller. The Back / Forward buttons - one of the main parts of the browser interface and with Ext JS 5 to make navigation in one-page applications became very simple.
Routing in Ext JS 5
Ext JS always allowed us to handle the navigation history using the 
Ext.util.History class, but in Ext JS 5 we made this process even simpler and more flexible. The router provides a simple connection configuration of hash tokens and controller methods with parameter support and route control (behind the scenes 
Ext.util.History is used). Let's look at a simple example:
Ext.define('MyApp.controller.Main', { extend : 'Ext.app.Controller', routes : { 'home' : 'onHome' }, onHome : function() {} }); 
In the 
routes object, the 
home key is a hash, and 
onHome is a method in the controller that is executed when navigating through it (for example: 
localhost#home localhost#home ). To change the hash inside the controller, you can use the 
redirectTo method:
')
  this.redirectTo('home');  
This will change the hash of the URL to 
#home , which in turn will call the 
onHome method, where the context will be the instance of the 
MyApp.controller.Main controller in which the route was defined. If you have the same route registered in several controllers, then the sequence of execution will be the same in which the application controllers are registered ( 
controllers array).
Hash tokens and parameters
The hash token can contain parameters, and the router passes them to the controller methods as arguments. The hash may look like 
'# user / 1234' , where 
1234 is the user ID. To match this hash, the controller is configured as follows:
  Ext.define('MyApp.controller.Main', { extend : 'Ext.app.Controller', routes : { 'user/:id' : 'onUser' }, onUser : function(id) {} }); 
When configuring a route with parameters, a colon is preceded by the parameter name. In this case, it is 
: id . The router will take any transferred value and pass it to the 
onUser method. The order of the arguments passed to the method is the same as the order of the parameters specified in the route.
You can control the matching of hash parameters using regular expressions. In the example above, the ID can contain only numbers, and the other values should not match. For this, the 
conditions configuration is used:
  Ext.define('Fiddle.controller.Main', { extend : 'Ext.app.Controller', routes : { 'user/:id' : { action : 'onUser', conditions : { ':id' : '([0-9]+)' } } }, onUser : function(id) {} }); 
This example shows two things: a route can be an object, in which the 
action key is a controller method, and 
conditions is an object with parameters and regular expression strings. The reason why a regular expression is written in a string is because the router creates the main expression based on the parameters of the route. The 
conditions config allows overriding regular expressions by default. The default regular expression for string parameters is 
'([% a-zA-Z0-9 \\ - \\ _ \\ s,] +)' .
To handle the transition on a route for which there are no matches, there is an 
unmatchedroute event. Its handler can be hung both on the application and on the controller. For example, on the controller:
  Ext.define('Fiddle.controller.Main', { extend : 'Ext.app.Controller', listen : { controller : { '*' : { unmatchedroute : 'onUnmatchedRoute' } } }, onUnmatchedRoute : function(hash) {} }); 
Sometimes it is necessary to catch the transition along a route in order to stop its execution or continue after performing some asynchronous action, for example, an ajax request. To do this, use the key key in the route. Here is an example in which the execution of the route continues after an ajax request:
  Ext.define('Fiddle.controller.Main', { extend : 'Ext.app.Controller', routes : { 'user/:id' : { action : 'onUser', before : 'beforeUser', conditions : { ':id' : '([0-9]+)' } } }, beforeUser : function(id, action) { Ext.Ajax.request({ url : '/user/confirm', params : { userid : id }, success : function() { action.resume(); }, failure : function() { action.stop(); } }); }, onUser : function(id) {} }); 
The 
beforeUser method accepts an 
id argument by analogy with 
onUser , as well as an 
action , in which there are 
resume and 
stop methods that control the execution of the route. The 
action.resume () method 
will continue the route, allowing it to be made asynchronous, and 
action.stop () will prevent its execution. If you pass the argument 
true to the 
stop method, the execution of all routes will be stopped.
Ext JS applications are getting bigger and more complex, and they may require processing multiple hash tokens at the same time. In Ext JS 5, this feature is implemented, and each hash token is processed separately in its sandbox. This means that if you cancel one route, passing 
true to the 
action.stop method, it will cancel the routes for this hash token only, and the rest will continue. Each token must be separated by a vertical line:
  #user/1234|message/5ga 
The router will split the hash and get the 
'user / 1234' and 
'message / 5ga' tokens . First, it will process the 
user token, find all the routes that match it and execute them. If no route is found matching this token, the unmatchedroute event will be 
triggered . Then the router will go to the 
message token and by analogy find the associated routes. If not found, the unmatchedroute event will be 
raised .
Conclusion
The new router in ExtJS 5 is easy to configure and also allows you to easily handle the history of the browser, while it remains flexible and powerful to meet the requirements of complex applications. Together with MVC + VM, bidirectional data binding and other new features, Ext JS 5 is an excellent framework for enterprise applications.