【问题标题】:Browser's back button break my Backbone / Marionette app浏览器的后退按钮破坏了我的 Backbone / Marionette 应用程序
【发布时间】:2015-03-04 10:39:53
【问题描述】:

我正在使用 Backbone 和 Marionette 以及服务器上的 Ruby on Rails 构建一个 Web 应用程序。

该应用运行良好,除了后退浏览器(FF、Chrome、IE11)的后退按钮会破坏一切。

这是一个重现问题的非常简单的示例:

var TestApp = new Marionette.Application();

TestApp.addRegions({
	mainRegion: "#main-region"
});

TestApp.navigate = function(route, options){
	options || (options = {});
	Backbone.history.navigate(route, options);
};

TestApp.getCurrentRoute = function(){
	return Backbone.history.fragment
};

TestApp.on("start", function(){
	if(Backbone.history){
		Backbone.history.start();
		if(this.getCurrentRoute() === ""){
			this.navigate("foo");
			TestApp.MyApp.Show.Controller.ShowFoo();
		}
	}
});

TestApp.module("MyApp", function(App, TestApp, Backbone, Marionette, $, _) {
	App.Router = Marionette.AppRouter.extend({
		appRoutes: {
			"foo": "ShowFoo",
			"bar": "ShowBar",
			"baz": "ShowBaz"
		}
	});
	
	var API = {
		ShowFoo: function(){
			App.Show.Controller.ShowFoo();
		},
		ShowBar: function(){
			App.Show.Controller.ShowBar();
		},
		ShowBaz: function(){
			App.Show.Controller.ShowBaz();
		}
	};
	
	TestApp.addInitializer(function(){
		new App.Router({
			controller: API
		});
	});
});

TestApp.module("MyApp.Show", function(Show, App, Backbone, Marionette, $, _)
{
	Show.FooLayoutView = Backbone.Marionette.LayoutView.extend({
		template: "#templates-foo",
		tagName: "span"
	});
	Show.BarLayoutView = Backbone.Marionette.LayoutView.extend({
		template: "#templates-bar",
		tagName: "span"
	});
	Show.BazLayoutView = Backbone.Marionette.LayoutView.extend({
		template: "#templates-baz",
		tagName: "span"
	});

	var ContactsShowController = Marionette.Controller.extend({
		ShowFoo: function()
		{
			this.fooView = new Show.FooLayoutView();
			
			App.mainRegion.show(this.fooView);
		},
		ShowBar: function()
		{
			this.barView = new Show.BarLayoutView();
			
			App.mainRegion.show(this.barView);
		},
		ShowBaz: function()
		{
			this.bazView = new Show.BazLayoutView();
			
			App.mainRegion.show(this.bazView);
		}
	});
	Show.Controller = new ContactsShowController;
});

$(function() {
	TestApp.start();
});
<h1>Test the browser's back button.</h1>

<div id="main-region"></div>

<script type="text/template" id="templates-foo">
	<p>
		F O O
	</p>

	<p>
		<a href="#bar">-&gt; Bar</a>
	</p>
</script>

<script type="text/template" id="templates-bar">
	<p>
		B A R
	</p>

	<p>
		<a href="#baz">-&gt; Baz</a>
	</p>
</script>

<script type="text/template" id="templates-baz">
	<p>
		B A Z
	</p>

	<p>
		Press the back button on your browser. You should go back to BAR, but the view is not shown.
	</p>
</script>
上面的 sn-p 可能不能直接工作,你需要包括 Backbone 和 MarionetteJS。

我正在使用这些版本的库:

  • underscore.js 1.7.0
  • backbone.js 1.1.2
  • backbone.marionette.js 2.2.2

因此,如果您加载应用程序,您应该会看到“F O O”,单击 Bar 的链接,单击 Baz 的链接。 您现在应该在显示“B A Z”的最后一页上。 现在单击浏览器上的后退按钮。 url 应该变回 #bar ,但您也应该看到“B A R”,但 #main-region 是空的。

我该如何解决这个问题?

我愿意更新这些库。坦率地说,我也正处于将骨干和木偶扔进垃圾箱并用旧的 javascript + jQuery 重新编码所有内容的边缘......但我不想这样做。

感谢您的帮助。

纪尧姆

【问题讨论】:

    标签: javascript backbone.js marionette backbone-routing


    【解决方案1】:

    更新:根据 cmets,很明显,罪魁祸首是 OP 的 rails 安装附带的一个附加组件。

    我建议他删除项目中的 rails/turbolinks 库,因为它似乎会干扰正确的页面重新加载。


    修改了您的代码并包含了您发布的相同库。我没有改变任何东西,它就像魔术一样工作。

    我也用过jQuery 2.1.0你的版本是什么? 请参阅fiddle

    【讨论】:

    • 感谢您的回复,但对我没有帮助。
    • 你的小提琴很好用。我将 jquery-rails 更新到版本 4.0.3,现在我在我的 application.js 中使用 jquery2,即 jQuery 2.1.3。如果我执行捆绑列表,它会给我这个filedropper.com/bundle-list 这是完整的代码:filedropper.com/test-history 我不知道这个文件托管网站,所以我希望它运作良好......我执行了 rake assets:clobber 和rake assets:precompile,清除浏览器缓存,使用其他浏览器。没有任何效果 :(,我的队友没有更多的运气。
    • 当我返回时,url 和 main-region 都正确显示,但 main-region 在半秒后被清除。 PS:为什么stackoverflow上的cmets这么小?我不得不将我的评论分成 3 个文件加上一个文件...... w/e 谢谢
    • 我的防病毒软件不允许我从您提供的文件托管站点下载文件。我建议你把你的项目放在 GitHub 上。您是否在调试器控制台中遇到任何错误?
    • 注意到github.com/GuillaumeGrillonLabelle/test-history/blob/master/app/…,请参阅文档:github.com/rails/turbolinks。这可能会干扰您的链接。您可以通过执行&lt;a href="#bar" data-no-turbolink&gt;-&amp;gt; Bar&lt;/a&gt; 之类的操作来使视图链接(Foo、Bar、Baz)链接非涡轮链接
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 2021-05-20
    • 2012-04-05
    • 1970-01-01
    • 2013-01-13
    相关资源
    最近更新 更多