在回答other question时,我写了错误的声明,表示在每次转换后都会运行ApplicationRoute.beforeModel()
挂钩。当意识到这个事实时,我确认钩子只使用裸线Ember app运行一次。
不幸的是,我在文档中找不到可以解释这种行为的任何内容。 First paragraph of beforeModel documentation州:
当尝试转换到路由或其中一个子路径时,此挂钩是第一个路由条目验证挂钩。
至于ApplicationRoute
- 关于它的内容并不多,在指南的action bubbling部分,我们可以找到行动从控制器通过路径到其父级的信息,并列出{{1} }作为路线的顶级父母:
如果模板的控制器和当前活动的路由都没有实现处理程序,则操作将继续冒泡到任何父路由。最终,如果定义了ApplicationRoute,它将有机会处理该操作。
从逻辑上讲,这应该意味着每个转换应该运行ApplicationRoute
挂钩,这与实际发生的情况相反。
所以问题是:
为什么ApplicationRoute
没有回复过渡事件?与定义的路线有什么不同?
答案 0 :(得分:2)
您的主要问题似乎是:为什么应用程序路径不会随着每次转换而运行?长的答案有点复杂,但简短的回答是:因为它没有。
对于长答案,让我们做一个示例路由层次结构。
application
index
photos
view
new
一组非常简单的路线。现在让我们假设你想访问photos.view
路线。 Ember将遵循以下步骤:
application
路由挂钩。 (包括beforeModel
,model
和afterModel
)。photos
路由挂钩。 (包括beforeModel
,model
和afterModel
)。view
路由挂钩。 (包括beforeModel
,model
和afterModel
)。 Ember必须为您要访问的路线的每个父路线初始化路线。那讲得通。但是,假设您已从photos.view
转换为photos.new
。 Ember 不会重新运行application
和photos
路由设置挂钩。它不需要。这些模型已经解决,没有任何东西使它们失效。 Ember 仅运行photos.new
设置挂钩。如果您转换到index
路由,它只会为该路由运行安装挂钩,而不是应用程序路由。
简短的故事,如果没有必要,Ember不会重新运行设置挂钩和模型获取逻辑。除非您使一些缓存数据无效或强制重新加载,否则Ember只会运行一次application
路由挂钩。
如果你想要在每次转换之前运行逻辑,那么我以前做过的事情就是创建一条我所有路由都延伸的基本路由,然后覆盖activate
hook。