2012-02-13 29 views
10

Vì vậy, tôi cần phải loại bỏ bộ định tuyến trong backbone.js để ngăn các tuyến đường của nó xuất hiện. Tôi đã thử myRouter.off()myRouter.remove() mà không có bất kỳ may mắn nào.Hủy liên kết bộ định tuyến trong backbone.js

Tôi có thể làm gì để thay thế?

Trả lời

14

Không có cách nào được hỗ trợ chính thức để thực hiện việc này (mà tôi biết). Nếu bạn muốn vô hiệu hóa bất kỳ router , bạn có thể sử dụng Backbone.history.stop();, đó là không có giấy tờ, nhưng xuất hiện trong mã nguồn với nhận xét này:

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

Nếu không, bạn sẽ phải mã hóa một số điều kiện passthrough trong của bạn bộ định tuyến của bộ định tuyến nếu trạng thái của bộ định tuyến bị "tắt" hoặc tương tự như vậy. Hoặc lặp lại trên Backbone.history.handlers không có giấy tờ (mảng nội bộ chứa .route - như là một regexp - và .callback) và loại bỏ các tuyến liên quan đến bộ định tuyến cụ thể này.

Rõ ràng, không có giấy tờ và tất cả, điều này có thể thay đổi trong bản phát hành tương lai của Backbone.

+0

buồn cười, tôi sẽ nghĩ vô hiệu hóa nó sau khi đăng xuất khỏi App rất hữu ích, có nhiều cách khác để xử lý i t, nhưng tôi thực sự thích backbone.history.stop – pushplaybang

0

nếu bạn có thể kiểm soát instantiation của router của bạn, bạn có thể làm như sau:

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

Bạn có thể sử dụng giải pháp hack-dựa (nó sử dụng phương pháp phi API và có thể ngừng làm việc với các phiên bản mới của 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>

Các vấn đề liên quan