gpt4 book ai didi

ember.js - Ember 1.12.0 实例初始化程序 : deferReadiness method doesn't exist

转载 作者:行者123 更新时间:2023-12-04 00:40:12 24 4
gpt4 key购买 nike

在 ember 关于 1.12 版本的博客文章中,提到了一个在实例初始化程序中使用 application.deferReadiness 的示例。但是,它似乎没有用。 initialize 函数的第一个参数没有 deferReadiness 方法。有什么想法吗?

最佳答案

我觉得发@tomdale explanation是合理的在这里作为答案。

@tomdale:“不可能在实例初始化器中延迟应用准备就绪,因为根据定义,实例初始化器仅在应用完成启动后运行。

关于应用程序启动语义的边栏:“应用程序就绪”(如 deferReadiness( )和 advanceReadiness() ) 指的是应用程序的所有代码是否都已加载。加载所有代码后,将创建一个新实例,即您的应用程序。

重申一下,在浏览器中运行的 Ember 应用程序的生命周期是:

  1. Ember 负载。
  2. 您创建一个全局的 Ember.Application 实例(例如应用程序)。
  3. 此时,您还没有加载任何类。
  4. 在评估 JavaScript 文件时,您可以在申请(例如 App.MyController = Ember.Controller.extend(…);)

  5. Ember 等待 DOM 准备就绪,以确保您的所有 JavaScript通过 <script> 包含在内标签已加载。

  6. 初始化程序已运行
  7. 如果您需要延迟加载代码或等待其他设置,您可以调用 deferReadiness()
  8. 一切加载完成后,您可以调用 advanceReadiness()
  9. 此时,我们说 Application是准备好;换句话说,我们已经告诉 Ember 所有的类组成应用程序的(组件、路由、 Controller 等)是加载。
  10. 创建了一个新的应用程序实例,实例初始化程序运行
  11. 开始路由并将 UI 呈现给屏幕。

如果你想延迟显示 UI 因为你需要做一些运行时设置(例如,你想在应用程序开始运行之前打开一个 WebSocket),正确的解决方案是使用 beforeModel/model/afterModel ApplicationRoute 中的钩子(Hook).所有这些 Hook 都允许您返回一个 promise ,该 promise 将阻止对子路由进行评估,直到它们解决为止。

使用 deferReadiness() in initializer 是一个不幸的hack,许多人已经开始依赖它。我称其为 hack,因为与路由器中的模型 promise 链不同,它会破坏错误和加载子状态等内容。通过在初始化程序中阻止渲染,IMO 你正在为用户创造更糟糕的体验,因为如果 promise 缓慢或拒绝,他们将看不到加载或错误子状态,而且我看到的大多数代码都没有任何错误处理代码根本。这导致应用程序可能会崩溃,只有一个空白的白屏,并且不会向用户表明发生了不好的事情。”

另见讨论:https://github.com/emberjs/ember.js/issues/11247

关于ember.js - Ember 1.12.0 实例初始化程序 : deferReadiness method doesn't exist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30276489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com