【问题标题】:Why ApplicationRoute doesn't react to transitions为什么 ApplicationRoute 对转换没有反应
【发布时间】:2015-09-01 12:20:40
【问题描述】:

在回答 other question 时,我做了不正确的陈述,即每次转换后都会运行 ApplicationRoute.beforeModel() 钩子。当意识到这一事实时,我确认该挂钩仅使用准系统 Ember 应用程序运行一次。

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

这个钩子是第一个在尝试转换到一个路由或其子路由时调用的路由条目验证钩子。

至于ApplicationRoute - 关于它的内容不多,在指南的action bubbling 部分中,我们可以找到从控制器通过路由到其父级的动作冒泡的信息,并将ApplicationRoute 列为顶级父级路线:

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

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

所以问题是:

为什么ApplicationRoute 不响应转换事件以及与已定义路由的其他区别是什么?

【问题讨论】:

    标签: javascript ember.js


    【解决方案1】:

    您的主要问题似乎是:为什么应用程序路由不是在每次转换时都运行?长答案有点复杂,但简短的答案是:因为它不必。

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

    application
        index
        photos
            view
            new
    

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

    1. 运行application 路由挂钩。 (包括beforeModelmodelafterModel)。
    2. 运行photos 路由挂钩。 (包括beforeModelmodelafterModel)。
    3. 运行view 路由挂钩。 (包括beforeModelmodelafterModel)。

    Ember 必须为您要访问的路由的每个父路由初始化路由。这就说得通了。但是假设您从photos.view 过渡到photos.new。 Ember 不会重新运行 applicationphotos 路由设置挂钩。它不需要。这些模型已经得到解决,并且没有任何东西使它们无效。 Ember 只会运行photos.new 设置挂钩。如果您转换到 index 路由,它只会运行该路由的设置挂钩,而不是应用程序路由。

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

    如果您希望在每个转换之前运行逻辑,我之前做过的事情是创建一个基本路由,我的所有路由都从该路由扩展,然后覆盖activate hook

    【讨论】:

    • 确实,一旦处理嵌套路由并观察行为,这一点就会更加明显。如果能以某种形式出现在开发者指南中,那就太好了。
    猜你喜欢
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 2019-08-17
    相关资源
    最近更新 更多