在我们的应用程序中,我们实际上有两个Backbone SPA应用程序。第一个用于未经身份验证的用户的登录,注册和其他功能。此URL的URL类似于http://www.example.com/registration#signin。登录后,您将被重定向到http://www.example.com/ui#home的主要Backbone应用程序。
在我的主UI应用程序中,我使用Backbone.history 而不使用 pushState。 App文件类似于:
define(function (require) {
var App = new Marionette.Application();
App.addInitializer(function (options) {
...
});
...
App.on('initialize:after', function () {
$(function(){
if (Backbone.history) {
Backbone.history.start({ root: '/ui' });
}
});
$.log("**WebApp**: Marionette app started.");
});
return App;
});
当然,除IE 9外,任何浏览器都可以正常运行(也许10个,我需要检查)。在IE 9中,所有路由工作正常。单击http://www.example.com/ui#anotherpage等链接可以正常工作。 但,当用户点击浏览器中的“后退”按钮时,它们不会被发送回上次触发的路线。相反,它们被发送到http://www.example.com/registration#signin,这是我们的Web服务器Node服务的最后一页。当我点击链接时,我可以看到history.length和Backbone.history.history.length没有更新。
所有路线都是从链接/网址中触发的。我在代码中没有使用router.navigate()。以下是我们路由器的示例:
define(function (require) {
var Backbone = require('backbone'),
Marionette = require('marionette');
return Backbone.Marionette.AppRouter.extend({
appRoutes: {
"": "showHome",
"home": "showHome",
"foo": "showFoo"
}
});
});
和控制器:
define(function (require) {
var Backbone = require('backbone'),
Marionette = require('marionette');
return Backbone.Marionette.Controller.extend({
showHome: function () {
require(['webapp','modules/home'], function (WebApp) {
WebApp.module("Home").start();
WebApp.module("Home").controller.showModule();
});
},
showFoo: function () {
require(['webapp', 'modules/foo'], function (WebApp) {
WebApp.module("Foo").start();
WebApp.module("Foo").controller.showModule();
});
}
});
});
更新
进一步的研究表明,问题在于旧版本的IE不会记录其历史记录中的哈希变化。见 - Change location.hash and then press Back button - IE behaves differently from other browsers。但是,我仍然不确定解决方法是什么。我猜它会以某种方式涉及用jQuery Hashchange这样的插件手动处理哈希变更事件并做某事吗?手动设置IE的历史记录?或者,当我们在IE中检测到后退按钮时,制作自定义历史对象并使用它?
答案 0 :(得分:0)
我在IE的一个应用程序中遇到了同样的问题。 如下所示启动骨干历史。
Backbone.history.start({
pushState: true,
hashChange: false
});
更新:正如T Nguyen所说, 当您将pushState设置为true时,哈希URL不再触发路由。除非您为所有Backbone路由添加服务器端支持,否则您需要在客户端添加一个事件处理程序,它捕获适当的链接并在路由上调用.navigate()