在我们的应用程序,我们实际上有两个骨干SPA应用。 第一种是用于登录,注册和其它特征为未经验证的用户。 造成这种情况的URL会是这样的http://www.example.com/registration#signin 。 一旦你登录,你在重定向到我们的主骨架应用http://www.example.com/ui#home 。
在我的主界面的应用程序,我使用Backbone.history 没有 pushState的。 该应用程序文件看起来是这样的:
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服务器提供服务的最后一页。 当我点击通过链接,我可以看到history.length和Backbone.history.history.length没有更新。
所有路由从链接/ URL的解雇。 我没有使用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不记录在他们的历史哈希值发生变化。 见- 更改的location.hash,然后按返回键- IE从其他浏览器的行为不同 。 但我还是不知道这个解决方法是什么。 我猜它会以某种方式手动包括搬运哈希改变事件有一个插件,如jQuery的Hashchange和做...什么? 手动设置IE浏览器的历史? 或者制作一个自定义的历史对象,并使用它时,我们发现在IE后退按钮?