针对浏览器的不同响应的Backbone.js路由器模式“;背面“;按钮或直接导航
Backbone.js router pattern for different response to browser "back" button or direct navigation
有没有一个好的模式可以实现对这两个事件有不同响应的Backbone.js路由器:
-
直接导航-用户通过调用
Router.navigate()
将url直接放入浏览器或应用程序,直接导航到页面 - 浏览器"后退"按钮-用户按下"后退"键可转到以前所在的页面
我之所以这么问,是因为如果路由器是由于用户按下"返回"按钮而被调用的,我只想通过$('element_id').html(view.el)
将旧视图放回其元素中,而无需将数据重新加载到模型中并重新渲染视图。
如果用户通过在浏览器中输入url、单击链接或从应用程序中调用router.navigation()直接导航到页面,从而调用路由器,我希望路由器指示模型重新请求数据并触发视图的重新呈现。
任何帮助和建议都将不胜感激,非常感谢!
我不久前也遇到过类似的问题。这可能比你想要的要多,但以下是我发现的有效方法。
直接导航
对于直接导航,通常的流程是这样的:
-
初始化应用程序:大多数backbone.js项目都会有一些初始化应用程序的代码(app.init)。虽然很多例子在实际的HTML中插入了集合的JSON(todos等),但我个人喜欢在页面加载后将此代码用作获取集合的机会,比如(coffeescript):
window.App = ... init: -> @todos = new App.Todos() @todos.deferred = @todos.fetch() @threads.deferred.done -> App.appRouter = new App.AppRouter(collection: self.todos) ...
(使用jQuery的deferred是为了确保在实际呈现页面之前提取集合。)
-
初始化路由器:在这里,您有机会将元素分配给路由器,并将集合分配给路由器(我使用的是来自thingbot骨干支持的"SwappingRouter",我强烈建议您查看):
App.Router = Support.SwappingRouter.extend ... initialize: (options) -> @el = $('.content') @collection = options.collection
-
执行路由处理程序:这是最后一步,此时集合已经初始化,路由器有一个指向它的指针,所以我们只需要创建视图并渲染它:
show: (id) -> view = new App.TodosView(model: @collection.get(id)) @swap(view)
(Swap渲染视图并做一些其他事情来清理。)
浏览器后退按钮
在这种情况下,既不调用App.init也不调用AppRouter.initialize,因此默认情况下不会重新加载集合。主干将自动调用上一条路线上的导航,因此根据路线处理程序中的内容,视图可能会被重新渲染。在上面的例子中,它是(交换调用渲染),但您可以解决这个问题。
主干网的关键问题是,您同时使用无状态(HTTP)协议和有状态(富客户端应用程序)环境。把两个人排成一排,这样他们就能很好地配合在一起,这可能很棘手。
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 正在添加'X'按钮,在文本字段旁边使用javascript
- 多个单选按钮组相互干扰
- JavaScript下拉菜单-点击按钮并根据所选值重定向到url
- Javascript按钮下拉列表
- jquery试图按名称获取按钮位置
- 漂亮照片图片库中的Facebook赞按钮
- 扩展移相器按钮类不工作
- 通过单击表单中的按钮,在代码生成中使用javascript生成字母数字代码
- 为什么我的表格在'背面'按钮
- 如何获取浏览器's”;背面“;按钮以清除d3.js可视化的先前状态
- 针对浏览器的不同响应的Backbone.js路由器模式“;背面“;按钮或直接导航
- 如何管理浏览器“;背面“;以及“;向前“;按钮
- 我可以禁用“;背面“;按钮浏览器功能
- 什么'这是隐藏'背面'jquery表单向导第一页上的按钮
- 我怎样才能防止盒子背面/菜单按钮上的默认行为?
- 我能推一下";背面";按钮在铬与javascript
- 浏览器”;背面“;按钮指向特定页面
- 选择选项背面丢失按钮&搜索结果恢复为默认选项
- 如何添加'背面'按钮指向在新选项卡中打开的外部页面