骨干路由器:如何等待视图准备好?

时间:2014-03-21 09:05:22

标签: backbone.js backbone-views backbone-events

在使用Backbone组织的地图应用程序中,主视图显示地图上的路径。该视图需要在首次加载时从服务器获取的数据,这需要时间(~500ms)。

每个路径都有一个唯一的URL设置路由/导航。

当用户点击此网址的外部链接并到达应用程序时,地图视图无法立即显示该路径;它需要先获取数据。

为了做到这一点,我已经设置了一个非常复杂/复杂的过程(如下所述),但我想知道是否有更好/规范的方法来做到这一点?


到目前为止,这是我的解决方案:

  1. 一般而言
    • 有一个全球性的" View"叫"派遣"这不是一个真正的视图,但用于存储各种其他视图的状态
    • 准备好后,地图视图会触发一个要调度的事件,以便它知道地图已准备就绪(" mapIsReady")
  2. 加载新网址后
    • 在一个新的url上,路由对象立即更新模型,然后触发一个事件来发送,实质上说是#34;尽可能更新路径"
    • 收到此消息后,dispatch使用setTimeout监视地图视图的状态(它自己存储)
    • 当地图视图准备就绪时,调度会触发"更新"模型上的事件,告诉每个视图显示它
  3. 优点

    • 它有效!
    • 观点不会直接调用彼此的方法,一切都是通过事件完成的

    限制

    • 发送"查看"真的不是一个观点
    • 事件链可能有点复杂,以及将来调试
    • setTimeout感觉不对

    编辑:或者我的问题是我想要同步页面上的所有内容而我不应该这样做。在页面上有三个视图以不同的方式呈现相同的信息,只有地图视图存在需要数据进行渲染的问题。

    所以它是地图视图的问题,而不是每个人的其他问题,所以也许正确的方法是让所有这些调度业务都在地图视图中发生,并且让其他观点尽快完成他们的工作......?

2 个答案:

答案 0 :(得分:0)

创建单独的对象以跨多个视图管理复杂逻辑并不错。但是没有必要让它看起来。您可以使用普通JS对象作为某种控制器/介体。

此外,我认为在这种情况下使用promises更好(例如$.Deferred())。它们使应用程序中的异步逻辑更容易控制,例如,您可以执行以下操作:

$.when(prepareMapView, loadPathData).done(showPathToView);

答案 1 :(得分:0)

哟可能会这样使用:

this.yourMapModel.fetch({
  success: function(model, response, options){
      //"your code after successful return from url"
  },error:function(model, response, options){
       //"your code after error"
});