Javascript 无散列的主干路由器
我已经建立了一个超级简单的主干应用程序,其中只有一个路由器和两个视图,以尝试确定正确的方法来处理路由,而不使用散列Javascript 无散列的主干路由器,javascript,backbone.js,pushstate,backbone-routing,html5-history,Javascript,Backbone.js,Pushstate,Backbone Routing,Html5 History,我已经建立了一个超级简单的主干应用程序,其中只有一个路由器和两个视图,以尝试确定正确的方法来处理路由,而不使用散列 var Router = Backbone.Router.extend({ routes: { '': 'index', 'episodes': 'episodes' }, index: function () { var view = new IndexView(); view.render
var Router = Backbone.Router.extend({
routes: {
'': 'index',
'episodes': 'episodes'
},
index: function () {
var view = new IndexView();
view.render();
},
episodes: function () {
var view = new EpisodesView();
view.render();
}
});
var IndexView = Backbone.View.extend({
el: $('#primary'),
render: function () {
console.log('index view');
}
});
var EpisodesView = Backbone.View.extend({
el: $('#primary'),
render: function () {
console.log('episodes view');
}
});
var router = new Router;
Backbone.history.start({pushState: true});
我意识到history
对象允许在页面之间进行向前和向后导航,这非常好。然而,它的实际实现方式对我来说似乎有点混乱
例如,我创建了一个简单的MAMP服务器来提供index.html
文件和JS文件。导航到http://backbone:8888/
,控制台会像我告诉它的那样记录索引视图。但是,导航到http://backbone:8888/episodes
(在地址栏中键入)返回404。但是,如果我导航到http://backbone:8888/#episodes
,URL重定向到http://backbone:8888/episodes
(没有hashbang)我将剧集视图
记录到控制台,这显然意味着它正在点击剧集视图
视图
从这里,我可以在索引和剧集视图之间来回切换。(回击/向前击/剧集)。在我再次在/剧集
上点击刷新之前,一切都很好。404
所以我的问题是:如何设置主干网来处理URL而不依赖哈希?我在这个主题上找到的所有东西都是“哦,只是pushState
!”。嗯,我使用的是pushState
,就像我上面描述的那样,如果没有404,你不能直接点击像/scents
这样的URL。当你使用push state时,页面是从后端提供的,这意味着你必须在后端定义一个对应于前端路由的对应路由
如果后端找不到请求的路由,那么它将发送404消息,因为它不知道该提供什么服务。在您的例子中,在前端级别触发“剧集”视图,但是浏览器没有DOM在页面刷新时呈现视图,因为没有提供任何服务
默认情况下,路由http://backbone:8888/
将提供索引文件,因为这是Web服务器的配置方式。
我不确定您使用的是什么后端技术,但用于从http://backbone:8888/episodes
,只需确保您的后端设置了一个路由器,为请求的路由提供服务,并且它应该可以工作 这是服务器端问题。Apache可能正在web目录中的文件夹中查找index.html。也许您可以尝试将Apache URL重写到您的root index.html,而不管您转到哪个URL。这可能不是一个好的长期解决方案,因为您可能需要添加某种服务器端逻辑(Node.JS、Python、Ruby、PHP等)。然后,您必须决定是否要在服务器端呈现正确的页面以及其他问题。