Backbone.js:如何从一个视图重定向到另一个视图?

时间:2011-10-13 22:43:21

标签: backbone.js

在Backbone.js中,Django中HttpResponseRedirect的等价物是什么?

在一个Backbone.View中,我需要将数据提交给服务器,然后将用户重定向到另一个视图。这是如何运作的?我应该使用事件还是路由器?

谢谢!

2 个答案:

答案 0 :(得分:50)

理解Backbone is not a stateless web server很重要,所以“重定向”可能听起来像你想要的,但很可能不是。如果您有构建有状态桌面应用程序的经验,请从该体验中获取,以及如何从一个屏幕移动到另一个屏幕。如果您没有任何桌面客户端体验,我强烈建议您掌握一些,因为Backbone应用程序是一个有状态的应用程序,它恰好在浏览器中运行。

假设你有一些有状态的应用程序知识,你有几个选择来完成这项工作。

Router.navigate:“redirect”等价物(不是粉丝)

在您回拨服务器后,您可以拨打路由器的navigate方法:myRouter.navigate("/myRoute", true)。请务必将true参数作为第二个参数传递。或者,就像JasonOffutt建议的那样,只需手动更新url的哈希片段,它实际上就是一样的。

I'm not fond of this,但有些人是。

程序工作流程

当您调用方法时,您可以创建一个非常简单的对象,该对象知道如何将正确的视图放在屏幕上。例如,如果需要显示名为“WidgetView”的视图,请使用名为showWidgetView的方法创建对象。通过将此方法附加到命名空间,将其传递给正在运行的代码或其他技术,可以在代码中的任何位置使用此方法。当您对服务器的调用返回时,请调用对象的showWidgetView方法,让它为您显示下一个视图。

这是功能性的,但除了非常小的应用之外,它很快就会变得混乱。不过,我在小应用程序中这样做。当您使用大型应用程序时,您需要考虑规范的工作流程和事件驱动的体系结构。

活动和工作流程

在您的服务器调用返回后,使用an event aggregator之类的内容触发事件,让系统的其他部分知道发生了重要事情。然后,系统的这些其他部分可以确定响应内容,包括用新的替换当前视图的呼叫代码,更新URL路由等。

当你走下使用事件的道路时,最终你会遇到一个似乎不适合任何地方的代码集合。这通常是您的事件处理程序,通常是要封装的对象/关注点的标志。如果您使用事件驱动的体系结构,那么在Backbone中创建更高级别的工作流对象是个好主意。

这些工作流对象通常负责通过获取所有正确的视图和模型来启动工作流,然后包含视图和/或事件聚合器的事件处理程序。事件处理程序方法将通过通过方法传递的args或查看其他状态来检查应用程序的状态,并找出接下来需要发生的事情。然后它将导致应用程序根据新状态更改为它需要的任何内容。

此外,工作流对象为not a backbone construct。这是你自己构建的东西,只使用普通的旧JavaScript。

...

希望有所帮助。

答案 1 :(得分:6)

这是我一直采取的方法:

假设您的路由器定义了以下路由:

var MyRouter = Backbone.Router.extend({
    routes: {
        'first-route': 'first',
        'second-route': 'second'
    },
    first: function() {
        // render first view
    },
    second: function() {
        // render second view
    }
    // ...
});

我通常只使用标签并将href属性设置为我想要重定向到的哈希:

<a href="#first">First</a>

或者,如果您想在JavaScript中“重定向”,可以明确设置位置哈希:

window.location.hash = 'first';

我不是百分百肯定后者是'最佳实践',但我已经在很多好的教程中看到了它。

//编辑

因此,在重新阅读原始问题后,只需设置位置哈希,就可以在从服务器同步回调后“重定向”。