我目前正在为我的网络应用程序使用jQuery,Twitter Bootstrap和CanJS。我正在尝试使用CanJS实现路由。我正在使用Bootstrap的选项卡,当我单击一个选项卡时,它应该带来#tabSearch,#tabUser或#tabPermissions,但是哈希返回一个空字符串。 我做错了什么?
我用它来更改标签:
TabControl = can.Control.extend({}, {
init: function (element, options) {
element.find('a[href="' + options.defaultTab + '"]').tab('show');
this.userSearch = null;
this.userForm = null;
}
, 'a[data-toggle="tab"] show': function (e) {
this.options.tabChangeCallback(e);
}
});
UserTab = new TabControl('#tabctrlUser', {
defaultTab: '#tabSearch',
tabChangeCallback: function (e) {
if (e.context.hash == '#tabSearch') {
if (!this.userSearch) {
this.userSearch = new FormUserQuery('#tabSearch', {});
}
} else if (e.context.hash == '#tabUser') {
if (!this.userForm) {
this.userForm = new FormUser('#tabUser', {});
}
this.userForm.renderView(currentUser);
} else if (e.context.hash == '#tabPermissions') {
new FormPermissions('#tabPermissions', {});
}
}
});
以下是HTML部分:
<ul id="tabctrlUser" class="nav nav-tabs">
<li><a href="#tabSearch" data-toggle="tab">Pesquisar</a></li>
<li><a href="#tabUser" data-toggle="tab">Cadastrar/Alterar</a></li>
<li><a href="#tabPermissions" data-toggle="tab">Acessos</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane" id="tabSearch"></div>
<div class="tab-pane" id="tabUser"></div>
<div class="tab-pane" id="tabPermissions"></div>
</div>
答案 0 :(得分:2)
您需要使用can.route或can.Control.Route,执行此操作的方式很复杂,请查看this question 关于路由
还有2 good articles查看此gist
http://jsfiddle.net/Z9Cv5/2/light/
var HistoryTabs = can.Control({
init: function( el ) {
// hide all tabs
var tab = this.tab;
this.element.children( 'li' ).each(function() {
tab( $( this ) ).hide();
});
// activate the first tab
var active = can.route.attr(this.options.attr);
this.activate(active);
},
"{can.route} {attr}" : function(route, ev, newVal, oldVal){
this.activate(newVal, oldVal)
},
// helper function finds the tab for a given li
tab: function( li ) {
return $( li.find( 'a' ).attr( 'href' ) );
},
// helper function finds li for a given id
button : function(id){
// if nothing is active, activate the first
return id ? this.element.find("a[href=#"+id+"]").parent() :
this.element.children( 'li:first' );
},
// activates
activate: function( active, oldActive ){
// deactivate the old active
var oldButton = this.button(oldActive).removeClass('active');
this.tab(oldButton).hide();
// activate new
var newButton = this.button(active).addClass('active');
this.tab(newButton).show();
},
"li click" : function(el, ev){
// prevent the default setting
ev.preventDefault();
// update the route data
can.route.attr(this.options.attr, this.tab(el)[0].id)
}
});
// configure routes
can.route(":component",{
component: "model",
person: "mihael"
});
can.route(":component/:person",{
component: "model",
person: "mihael"
});
// adds the controller to the element
new HistoryTabs( '#components',{attr: 'component'});
new HistoryTabs( '#people',{attr: 'person'});
答案 1 :(得分:1)
我对CanJS并不熟悉,但这可能有一些事情要做,点击事件在导航之前发生, location.hash 在之后设置。例如。如果(作为测试)您将链接定义为
<a href="#tabSearch" onclick="tabChangeCallback()">Pesquisar</a>
在简单的香草JS尝试
function tabChangeCallback() {
alert(location.hash)
}
它将显示空白。
但如果你尝试类似
的话function tabChangeCallback() {
setTimeout(function() {
alert(location.hash)
}, 100)
}
将显示哈希值。因此,在您的情况下,要么将代码设置为在主事件后超时执行,或者(我认为这是一个更好的选项)而不是哈希,您应该读取导致事件的锚元素的href
属性。
更新下面的简单JS示例显示了如何在没有超时的情况下获取哈希值:
function tabChangeCallback(e) {
var elem = e ? e.target : event.srcElement
alert(elem.getAttribute("href"))
}