gpt4 book ai didi

jquery - 主干路由器不会触发事件

转载 作者:行者123 更新时间:2023-12-03 22:52:43 25 4
gpt4 key购买 nike

当应用程序启动时,我在 dom 上有一些导航链接,我希望通过 Backbone 劫持这些链接以进行渐进增强(主干应用程序底层有一个非常静态的文本内容版本)。

html 看起来像这样:

...
<body>
<header>
<nav>
<ol>
<li>
<a href="/en/home">home</a>
</li>
<li>
... few more links
</header>

然后我的应用程序使用以下方式实例化:

var App = (function(fw){
var $ = fw;
var workspace = {};
var self = {};
var lang = "en";
var models = {...};
var views = {...};
var collections = {...};
self.init = function() {
workspace = new Workspace(
{
routes: {
"/": "home",
"/home": "home",
"/terms": "terms",
"/news": "blog"
},
lang : lang
})
}
return self;
});
var app;
// launch
$(document).ready(function() {
app = new App(jQuery);
app.init();
});

工作区只是一个路由器,来自应用程序的那些路由通过初始化函数正确处理到路由器中,链接也可以正常工作并按预期更改 URL,并在旧版浏览器上使用哈希值进行更改。问题是路由器/工作区本身没有进行任何回调。它只是静音,并且在单击时不会触发功能

这是我的工作区/路由器:

var Workspace = Backbone.Router.extend({

routes : {},
//functions <------------THESE
home: function(e){
e.preventDefault();
console.log("home here");
App.views.HomeView.render();
},
terms: function(){ //<-----------NEVER
console.log("terms here");
App.views.TermsView.render();
},
blog: function(){ //<-----------FIRE
console.log("blog here");
},
initialize: function(params){
var t = this;
var tmpr = {};
for(var i in params.routes)
{
//this just fuses lang and each route so /home becomes /en/home
tmpr["/"+params.lang+i] = params.routes[i];
}
this.routes = tmpr; // this is fine and when logged it shows nicely with all routes looking good
// router will only ever initialize once so lets deal with the stuff currently on the DOM before the app is inited.
$("a",$("header")).click(function(e){
e.preventDefault();
Backbone.history.navigate($(this).attr("href"),true);//<-- true is set? should fire methods?
// I've also tried all kinds of variations like t.navigate(..) where t is this workspace
});
//this also seems to be fine and either does hashes or states
if(history && history.pushState) {
Backbone.history.start({
pushState : true
});
console.log("has pushstate");
} else {
Backbone.history.start();
console.log("no pushstate");
}
console.log("Router inited with routes:",this.routes);//logs routes nicely
}
});

最佳答案

initialize函数运行时,路由已经被绑定(bind)(参见the backbone source)。

您可以使用_bindRoutes函数触发路由绑定(bind):

this.routes = tmpr;
this._bindRoutes();

关于jquery - 主干路由器不会触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8122622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com