在ember关于1.12版本的博客文章中,提到了在实例初始化程序中使用application.deferReadiness
的示例。但是,它似乎没有起作用。 initialize
函数的第一个参数没有deferReadiness
方法。有什么想法吗?
答案 0 :(得分:3)
我认为在此发布@tomdale explanation作为答案是合理的。
@tomdale :"无法在实例初始化程序中推迟应用程序准备就绪,因为根据定义,实例初始化程序仅在应用程序完成启动后运行。
关于应用程序启动语义的侧栏:"应用程序准备就绪" (如,deferReadiness(
)和advanceReadiness()
)指的是是否已加载应用程序的所有代码。加载完所有代码后,将创建一个新实例,即您的应用程序。
要重申,浏览器中运行的Ember应用程序的生命周期为:
在评估您的JavaScript文件时,您可以在上面注册类
申请(例如App.MyController = Ember.Controller.extend(…);
)
Ember等待DOM准备好确保您的所有JavaScript
通过<script>
标记添加的内容已加载。
deferReadiness()
。 advanceReadiness()
。 Application
是
准备;换句话说,我们告诉Ember所有的课程
(构成应用程序的组件,路径,控制器等)
加载。 如果您想延迟显示UI,因为您需要进行一些运行时设置(例如,您希望在应用程序开始运行之前打开WebSocket),正确的解决方案是使用beforeModel/model/afterModel
中的ApplicationRoute
个钩子。所有这些钩子都允许您返回一个承诺,该承诺将阻止子路由在被解析之前被评估。
在初始化程序中使用deferReadiness()
是许多人都依赖的不幸黑客。我称之为黑客,因为与路由器中的模型承诺链不同,它会破坏错误和加载子状态等内容。通过阻止初始化程序中的呈现,IMO会为用户创建更糟糕的体验,因为如果承诺缓慢或拒绝,他们将看不到加载或错误子状态,并且我所看到的大多数代码都没有任何错误处理代码。这导致应用程序只能通过空白屏幕打破,并且没有向用户显示发生了不良事件。&#34;