我注意到骨干路由器的导航方法不会重新加载当前路径。
例如,当前路线为/view1
,您拨打router.navigate('view1',{trigger:true});
。它不会再次激活路线事件。
这是我测试的代码:
<html>
<head>
<title>Testing123</title>
<script src="http://code.jquery.com/jquery.min.js" type="text/javascript"></script>
<script src="http://underscorejs.org/underscore-min.js" type="text/javascript"></script>
<script src="http://backbonejs.org/backbone-min.js" type="text/javascript"></script>
<style type="text/css" media="screen">
#box{
width:400px;
height:400px;
background-color:red;
}
</style>
</head>
<body>
<button id='view1'>view1</button>
<button id='view2'>view2</button>
<br/>
<div id='box'>
</div>
<script type="text/javascript" charset="utf-8" async defer>
var SystemRouter = Backbone.Router.extend({
routes: {
"view1":"view1",
"view2":"view2"
},
view1: function() {
console.log('view1');
},
view2: function() {
console.log('view2');
}
});
var sys = new SystemRouter();
Backbone.history.start({pushState: true, root: "/test/routing.html#/"});
sys.navigate('view1');
$('#view1').click(function(){
sys.navigate('view1',{trigger:true});
});
$('#view2').click(function(){
sys.navigate('view2',{trigger:true});
});
</script>
</body>
</html>
上面的代码将加载/view1
路径,打印出'view1'。但是,如果您尝试单击按钮以导航到/view1
路径,则会被忽略。
我的问题是:如果路线事件与当前路径相同,我如何调用路线事件?
答案 0 :(得分:32)
有几件事可以实现这一目标。如果您预计导航到已在URL中的路径,则首先使用Backbone.history.fragment
检查当前路径片段,并查看它是否与您要激活的路径相同。如果是这样,那么您可以执行以下任何操作:
您可以直接调用路线方法:sys.view1();
您可以将片段设置为另一个死路径,然后返回到您想要的路径。
sys.navigate('someDeadRoute');
sys.navigate('view1',{trigger: true});
您可以停止并重新启动路由器:
Backbone.history.stop();
Backbone.history.start()
这将再次拾取路线并运行它。
我想我会选择#1。
答案 1 :(得分:27)
而不是开始&amp;停止Backbone的历史记录,您可以致电Backbone.history.loadUrl
。
刷新当前页面:
Backbone.history.loadUrl(Backbone.history.fragment);
或者作为链接处理程序:
// `Backbone.history.navigate` is sufficient for all Routers and will trigger the
// correct events. The Router's internal `navigate` method calls this anyways.
var ret = Backbone.history.navigate(href, true);
// Typically Backbone's history/router will do nothing when trying to load the same URL.
// But since we want it to re-fire the same route, we can detect
// when Backbone.history.navigate did nothing, and force the route.
if (ret === undefined) {
Backbone.history.loadUrl(href);
}