Navigation 突出显示Backbone.js应用程序中的当前导航状态
我想突出显示当前的导航状态。就像hashchange是Navigation 突出显示Backbone.js应用程序中的当前导航状态,navigation,backbone.js,highlighting,Navigation,Backbone.js,Highlighting,我想突出显示当前的导航状态。就像hashchange是#home,我想以不同的方式设置“home”菜单链接的样式,类似于其他链接 Backbone.js触发单个事件,如路由:home路由:单击#home和其他链接时,其他一些。我看不到每一次hashchange都会触发的任何常见事件。因此,我需要通过绑定到所有路由事件来编写状态高亮逻辑,我认为这不是一个好的解决方案 因此,我在我的路由器子类/对象中重写了主干.Router.route,如 // override backbone' Router.
#home
,我想以不同的方式设置“home”菜单链接的样式,类似于其他链接
Backbone.js触发单个事件,如路由:home
<代码>路由:单击#home
和其他链接时,其他一些。我看不到每一次hashchange都会触发的任何常见事件。因此,我需要通过绑定到所有路由事件来编写状态高亮逻辑,我认为这不是一个好的解决方案
因此,我在我的路由器子类/对象中重写了主干.Router.route
,如
// override backbone' Router.route method to publish
// common 'route_change' event for any hash change
route : function(route, name, callback) {
Backbone.history || (Backbone.history = new Backbone.History);
if (!_.isRegExp(route)) route = this._routeToRegExp(route);
Backbone.history.route(route, _.bind(function(fragment) {
var args = this._extractParameters(route, fragment);
callback.apply(this, args);
this.trigger.apply(this, ['route:' + name].concat(args));
// ADDED BY: ManiKanta G
// name: route method
// fragment: route path
// args: any additional args
this.trigger.apply(this, ['route_change'].concat(name, fragment, args));
}, this));
}
这将为每个hashchange发布一个公共的route\u change
事件,并传递名称
,片段
,以及其他参数
,我将使用这些参数在单个位置高亮显示状态
我的问题是我是否必须像这样覆盖主干方法,或者是否有任何内置机制可以在这里使用。如果不是,我希望在Backbone.js中看到类似的行为
编辑:示例程序
使用上述路由器进行导航:
router.navigate('home', true);
输出:回家路线
更新上述程序不起作用的原因:
我们应该为
Router实例上的all
事件绑定,而不是在Router
本身上绑定-因此,将Router.bind('all',…
更改为Router.bind('all',…)
将使上述程序工作在主干网0.5.x中,您可以将所有
事件绑定到路由器实例,传递给处理程序的第一个参数是route
这里是,这里转载:
var dummy = Backbone.Router.extend({
defaultPage: 'messages',
routes: {
'': 'index',
'index': 'index',
'mailbox': 'mailbox'
},
index: function() {
// code here
},
mailbox: function() {
// code here
}
});
var router = new dummy();
router.bind('all', function(route) {
document.write('triggered: ' + route + '<br/>');
});
router.navigate('index', true);
router.navigate('mailbox', true);
var dummy=Backbone.Router.extend({
defaultPage:'消息',
路线:{
“‘索引’,
“索引”:“索引”,
“邮箱”:“邮箱”
},
索引:函数(){
//代码在这里
},
邮箱:函数(){
//代码在这里
}
});
var router=newdummy();
router.bind('all',函数(路由){
document.write('triggered:'+route+'
');
});
router.navigate('index',true);
路由器。导航('mailbox',true);
下面是我的一个应用程序的一个实例:
routes.bind('all ', function(route, section) {
var $el;
route = route.replace('route: ', '');
$el = $('#nav - ' + route);
// If current route is highlighted, we're done.
if ($el.hasClass('selected')) {
return;
} else {
// Unhighlight active tab.
$('#menu li.selected').removeClass('selected');
// Highlight active page tab.
$el.addClass('selected');
}
});
我面临的问题是,第一次加载页面时,菜单没有突出显示,因为事件发生在绑定启动之前。
我通过使用历史记录修复了此问题:
$('#menu li.'+Backbone.history.fragment).addClass('active');
以下是我正在做的:
@router.bind'all'(路由)->
#这会对每个路由触发两次;忽略第二次
如果route==“route”,则返回
#例如:route=“route:home”,name=“home”,href=“#home”
name=route.replace('route:','')
#删除所有当前导航链路上的活动类别
$(“#menu li.active”).removeClass('active')
#将其添加回以`name'结尾的href链接`
$(“#菜单a[href$='#{name}']”).parent().addClass('active'))
在主干网0.5.x中,您可以将all
事件绑定到路由器,传递给处理程序的第一个参数是route@ant_Ti-将其作为答案而不是评论发布,这样你就可以获得好评。@ant_Ti我不确定为什么我错过了你的评论。我试图将“全部”绑定到路由器,但它似乎不起作用。我没有h通过源代码,我也找不到触发任何“all”事件的路由器。我添加了简单的代码片段来演示这一点。你能添加一些代码吗(请回答)是的,当然!这里是谢谢。我没有想到我绑定的是路由器
,而不是它的实例路由器
。有了这个,我得到了路由更改事件,比如路由:主页
,只对已知的路由(因为只会对它们进行触发)。有了我目前的小补丁,我可以处理未知链接(404)我也需要(但在OP中没有提到)。请添加您的注释/程序作为答案。我会接受。正如其他人的参考:绑定到“all”事件会导致处理程序函数接收路由更改事件,如route:home,但仅针对已知路由(因为只对它们进行触发)问题,这会在所有内容呈现后触发?旧问题,但有人在吗?我有一个查询…我成功地完成了上述部分,但它在我的所有导航中触发了2次…第一次给出正确的信息,第二次总是空白…有什么想法吗???我也有类似的高亮显示逻辑(也要突出显示主菜单和子菜单)。但是所有
事件绑定的问题是它只接收已知路由。我想知道所有路由更改(简单地说,每个哈希更改)。这对于显示一些404错误非常有用。对于“404”路由检测,我将此添加为我的最后一个路由:“*path”:“第404页错误”
老问题,但有人在吗?我有一个查询…我成功地完成了上述部分,但它在我的所有导航中触发了2次…第一次给出正确的信息,第二次总是空白…有什么想法吗???听起来你在其他地方也有触发它的代码。在上述代码中添加一个警报,如果警报触发两次,你知道吗这是原因,如果不是,其他地方也有代码。
$('#menu li.'+Backbone.history.fragment).addClass('active');