Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无散列的主干路由器_Javascript_Backbone.js_Pushstate_Backbone Routing_Html5 History - Fatal编程技术网

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等)。然后,您必须决定是否要在服务器端呈现正确的页面以及其他问题。