为什么ApplicationRoute不会对转换做出反应

时间:2015-09-01 12:20:41

标签: javascript ember.js

在回答other question时,我写了错误的声明,表示在每次转换后都会运行ApplicationRoute.beforeModel()挂钩。当意识到这个事实时,我确认钩子只使用裸线Ember app运行一次。

不幸的是,我在文档中找不到可以解释这种行为的任何内容。 First paragraph of beforeModel documentation州:

  

当尝试转换到路由或其中一个子路径时,此挂钩是第一个路由条目验证挂钩。

至于ApplicationRoute - 关于它的内容并不多,在指南的action bubbling部分,我们可以找到行动从控制器通过路径到其父级的信息,并列出{{1} }作为路线的顶级父母:

  

如果模板的控制器和当前活动的路由都没有实现处理程序,则操作将继续冒泡到任何父路由。最终,如果定义了ApplicationRoute,它将有机会处理该操作。

从逻辑上讲,这应该意味着每个转换应该运行ApplicationRoute挂钩,这与实际发生的情况相反。

所以问题是:

为什么ApplicationRoute没有回复过渡事件?与定义的路线有什么不同?

1 个答案:

答案 0 :(得分:2)

您的主要问题似乎是:为什么应用程序路径不会随着每次转换而运行?长的答案有点复杂,但简短的回答是:因为它没有。

对于长答案,让我们做一个示例路由层次结构。

application
    index
    photos
        view
        new

一组非常简单的路线。现在让我们假设你想访问photos.view路线。 Ember将遵循以下步骤:

  1. 运行application路由挂钩。 (包括beforeModelmodelafterModel)。
  2. 运行photos路由挂钩。 (包括beforeModelmodelafterModel)。
  3. 运行view路由挂钩。 (包括beforeModelmodelafterModel)。
  4. Ember必须为您要访问的路线的每个父路线初始化路线。那讲得通。但是,假设您已从photos.view转换为photos.new。 Ember 不会重新运行applicationphotos路由设置挂钩。它不需要。这些模型已经解决,没有任何东西使它们失效。 Ember 仅运行photos.new设置挂钩。如果您转换到index路由,它只会为该路由运行安装挂钩,而不是应用程序路由。

    简短的故事,如果没有必要,Ember不会重新运行设置挂钩和模型获取逻辑。除非您使一些缓存数据无效或强制重新加载,否则Ember只会运行一次application路由挂钩。

    如果你想要在每次转换之前运行逻辑,那么我以前做过的事情就是创建一条我所有路由都延伸的基本路由,然后覆盖activate hook