【问题标题】:Backbone router: how to wait for the views to be ready?骨干路由器:如何等待视图准备好?
【发布时间】:2014-03-21 09:05:22
【问题描述】:

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

每条路径都有一个唯一的 url,其中设置了路由/导航。

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

我已经设置了一个非常复杂/令人费解的过程来执行此操作(如下所述),但我想知道是否有更好/规范的方法来执行此操作?


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

  1. 一般来说
    • 有一个名为“dispatch”的全局“视图”并不是真正的视图,而是用于存储各种其他视图的状态
    • 准备就绪时,地图视图会触发一个事件进行调度,以便它知道地图已准备就绪(“mapIsReady”)
  2. 加载新网址时
    • 在新的 url 上,路由对象立即更新模型,然后触发事件调度,本质上是“尽可能更新路径”
    • 收到此消息后,dispatch 使用 setTimeout 监视地图视图(它自己存储)的状态
    • 当地图视图准备就绪时,调度触发模型上的“更新”事件,告诉每个视图显示它

优势

  • 有效!
  • 视图之间不直接调用对方的方法,一切都是通过事件来完成的

限制

  • 调度“视图”实际上根本不是视图
  • 事件链可能有点复杂,难以跟踪......并在未来进行调试
  • setTimeout 感觉不对

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

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

【问题讨论】:

  • 如果你放一些代码会更清楚。
  • 您的地图视图正在从某个地方获取数据,好吗?是来自第三方吗?您正在调用该方法。 (可能是 REST)通过模型..您可以为它使用成功和错误回调函数。因此,当地图数据获取返回成功时,您可以在成功回调之后处理。或者如果错误在错误回调中处理它

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


【解决方案1】:

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

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

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

【讨论】:

  • 使用 Promise 并不是一个坏主意,除了 mapView 只需要准备一次,而它可能会显示许多路径(从 url 读取的路径,然后是其他路径跟随用户输入)。所以是的,对于来自 url 的第一个路径,我们可以在准备地图之后将其链接起来,但在这种特定情况下,我们需要过滤掉告诉地图视图进行渲染的一般“同步”事件。使用标志虽然有点不雅,但恕我直言,这是一种更通用的方法。
  • mapView 只需要准备一次的限制很容易使用 promise 解决。您应该只缓存创建的 Promise 并从 prepareMapView 方法返回它。因此,第一次创建 Promise 时,存储并返回它并进行异步准备,下一次您只需返回存储的 Promise(已解决或未解决)。
【解决方案2】:

你可以这样使用:

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

【讨论】:

    猜你喜欢
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多