Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
<meta name="description" content="Persist controller between route changes">
  <meta charset="utf-8">
  <script src="https://cdn.rawgit.com/lhorie/mithril.js/next/mithril.js"></script>
</head>
<body>
</body>
</html>
 
// slight variation of an idea by @barneycarroll
function persist( component ){
  var persistor = {
    controller : function(){
      var output = component.controller.apply( this, arguments ) || this
      
      persistor.controller = function(){
        return output
      }
      
      return output
    },
    view : component.view
  }
  
  return persistor
}
var compA = {
  controller : function(){
    alert( 'Initialising controller A' );
  },
  view : function( ctrl ){
    ctrl.draws = 1 + ( ctrl.draws || 0 )
    
    return [
      m( 'p', 'Controller A has persisted for ' + ctrl.draws + ' draw(s)' ),
      m( 'a', {
        config : m.route,
        href   : '/about'
      }, 'About' ),
      m( 'p', 'Multiple clicks result in only one initialization for each page')
    ]
  }
}
var compB = {
  controller : function(){
    alert( 'Initialising controller B' );
  },
  view : function( ctrl ){
    ctrl.draws = 1 + ( ctrl.draws || 0 )
    
    return [
      m( 'p', 'Controller B has persisted for ' + ctrl.draws + ' draw(s)' ),
      m( 'a', {
        config : m.route,
        href   : '/home'
      }, 'Home' ),
      m( 'p', 'Multiple clicks result in only one initialization for each page')
    ]
  }
}
m.route( document.body, '/home', {
  '/home'  : persist(compA),
  '/about' : persist(compB)
} )
Output

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
pelonpelonpro
0viewers