分享 使用 Spine 时遇到的一些问题

hpyhacking · 2012年08月31日 · 最后由 yedingding 回复于 2012年08月31日 · 2832 次阅读

现在我要让每个可以 Route 到的 URL Hash 都可以正确显示内容,所以可能一些功能层级较深的 Controller 或者 Stack 在一开始就会被触发。

举个例子,有一个 Stack 包含 Home 和 Project 两个 Controller,AppController 启动的时候负责Project.fetch()而 ProjectController 通过 refresh 得知可以使用 Project 了。

那么这个时候一个 URL Hash #/project/1/action 过来,Stack 中必将去激活 ProjectController,ProjectController#active()回调被触发,问题来了~

Project.fetch() 通过网络获取数据,非常有可能在被依赖的 Controller 激活后还没有完成自己的工作,此时激活回调使用 Project.find 必出异常。

普通的 Controller 我可以通过在 Project 的 refresh 事件中去调用 render,而 Stack 的 active 却与 Model 没什么关联。

我也曾想过在 AppController 中绑定必须的某些 Model 的 refresh 事件,然后在创建 Controller,但这样觉得失去了 Spine 推荐的通过 Event 隔离的意义,我觉得肯定有更好的方法来处理,其实就是一个 Model 和依赖 Model 的 Controller 同步的问题。

@yedingding @poshboytl

请各位给点意见。

刚才做了个简单的测试,在 Server 端设了个 3s 的超时。

现在的做法比较简单粗暴了,在 AppController 中 fetch 掉所有基本的 Model,然后调用Route.setup(),这样所有的 Controller 中的 refresh 都可以得到调用,也不用担心 active 某个 controller 的时候使用 Model 得不到数据了。

算是解决了吧

models = [App.User, App.Project]
refreshed_models = []

for model in models
  model.one 'refresh', ->
    refreshed_models.push @
    if refreshed_models.length is models.length
      Spine.Route.setup()
  model.fetch()

在 UI 上做 disable 呢?比如在 Project#refresh 事件发生后才 enable stack。Stack 是一开始就创建好的,但是只有 enable 了才可以被 route

4 楼 已删除
需要 登录 后方可回复, 如果你还没有账号请 注册新账号