2012-02-13 11 views
10

Quindi ho bisogno di rimuovere un router in backbone.js per evitare che si verifichi il percorso. Ho provato myRouter.off() e myRouter.remove() senza fortuna.Unbind un router in backbone.js

Cosa posso fare invece?

risposta

14

Non esiste un modo ufficialmente supportato per eseguire questa operazione (che io sappia). Se si desidera disattivare qualsiasi router, è possibile utilizzare Backbone.history.stop();, che è documentato, ma si presenta nel codice sorgente con questo commento:

// Disable Backbone.history, perhaps temporarily. Not useful in a real app, 
// but possibly useful for unit testing Routers. 

In caso contrario, si avrebbe dovuto codificare una condizione di passaggio nel vostro gestori del percorso del router se lo stato del router è "disabilitato" o qualcosa del genere. Oppure iterare sui Backbone.history.handlers non documentati (l'array interno che contiene il .route - come regexp - e. Callback) e rimuovere i percorsi relativi a questo specifico router.

Ovviamente, essendo non documentato e tutto, questo è soggetto a modifiche nelle versioni future di Backbone.

+0

divertente, penserei disabilitarlo dopo aver abbandonato App è utile, ci sono altri modi per gestire i t, ma mi piacerebbe davvero backbone.history.stop – pushplaybang

0

se si è in grado di controllare l'istanza del router, è possibile effettuare le seguenti operazioni:

var myRouter = new MyRouter({ routes: function(){ 
    return; 
}}); 
0

È possibile utilizzare la soluzione hack-based (che utilizza metodi non-API e potrebbe smettere di funzionare con le nuove versioni di Backbone.js)

var router = new(Backbone.Router.extend({ 
 

 
    routes: { 
 
    "authentication": "authentication", 
 
    "contacts": "contacts", 
 
    "*notFound": "notFound" 
 
    }, 
 

 
    /** 
 
    * @param {string} routeName 
 
    */ 
 
    disableRoute: function(routeName) { 
 
    var index, handler, handlers = Backbone.history.handlers; 
 
    delete this.routes[routeName]; 
 
    for (var i = 0, len = handlers.length; i < len; i++) { 
 

 
     handler = handlers[i]; 
 
     if (handler.route.toString() === router._routeToRegExp(routeName).toString()) { 
 
     handlers.splice(index, 1); 
 
     break; 
 
     } 
 
    } 
 
    }, 
 

 
    contacts: function() { 
 
    alert('route `contacts`'); 
 
    }, 
 
    authentication: function() { 
 
    alert('route `authentication`'); 
 
    }, 
 
    notFound: function() { 
 
    alert('route `notFound`'); 
 
    router.navigate('404'); 
 
    } 
 
})); 
 

 
Backbone.history.start({ 
 
    silent: true 
 
}); 
 

 
$(function() { 
 
    $('#remove').on('click', function() { 
 
    router.disableRoute('authentication'); 
 

 
    router.navigate('404'); 
 
    }); 
 

 
    $('#goto_auth').on('click', function() { 
 
    router.navigate('authentication', { 
 
     trigger: true 
 
    }); 
 
    }); 
 

 
    $('#goto_contacts').on('click', function() { 
 
    router.navigate('contacts', { 
 
     trigger: true 
 
    }); 
 
    }); 
 
});
button { 
 
    display: block; 
 
    margin: 10px; 
 
}
<html> 
 

 
<head> 
 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script> 
 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.1.2/backbone-min.js"></script> 
 

 
</head> 
 

 
<body> 
 
    <button id="goto_auth">goto authentication route</button> 
 
    <button id="goto_contacts">goto contacts route</button> 
 
    <hr> 
 
    <button id="remove">remove authentication route</button> 
 
</body> 
 

 
</html>