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

yic*_*hen 23 backbone.js

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

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

谢谢!

Der*_*ley 50

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

假设您拥有一些有状态的应用程序知识,那么您可以通过几种方法来完成这项工作.

Router.navigate:"重定向"等价物(不是这个的粉丝)

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

我不喜欢这个,但有些人是.

程序工作流程

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

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

活动和工作流程

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

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

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

此外,工作流对象不是主干构造.这是你自己构建的东西,只使用普通的旧JavaScript.

...

希望有所帮助.


小智 6

这是我一直在采取的方法:

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

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

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

<a href="#first">First</a>
Run Code Online (Sandbox Code Playgroud)

或者,如果要从JavaScript中"重定向",可以显式设置位置哈希:

window.location.hash = 'first';
Run Code Online (Sandbox Code Playgroud)

我并不是百分之百确定后者是"最佳实践",但我已经在一些好的教程中看到了它.

//编辑

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

  • 在Backbone中设置`window.location.hash`不是一个好习惯.请改用"Backbone.history.navigate". (2认同)