首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Emberjs中的实例初始化器

Emberjs中的实例初始化器
EN

Stack Overflow用户
提问于 2015-06-24 13:11:50
回答 1查看 1.4K关注 0票数 2

我们正在经历更新我们的成员-cli应用程序到它的最新迭代的漫长的艰苦工作。我们远远落在后面。我正处于引入实例初始化器的阶段,我感到这将打破我目前实现某个初始化器的方式。

代码语言:javascript
复制
export function initialize(container, application) {
  var store = container.lookup('store:main');

  // We need a basket to be present when
  // the application loads. Wait for this
  // to happen before continuing.
  application.deferReadiness();

  store.findOrCreateRecord('order', basketToken).then(function(basket) {
    container.register('basket:main', basket, { instantiate: false });
    application.inject('controller:basket', 'model', 'basket:main');

    // Let the application know we have
    // a basket and can continue.
    application.advanceReadiness();
  });
}

现在建议的是,我将其划分为一个“普通”初始化器来注册购物篮对象,以及一个实例初始化器来获取存储并调用我们的API服务器。但是,这样做,我将无法访问实例初始化器中的注册表,从而根据我的承诺注册返回的对象,然后将其注入到控制器中。我想我想错了,但我还没能把我的头绕过去。有什么建议我应该如何通过更新这个吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-25 07:39:41

我认为在这里发布@tomdale解释作为帮助其他人理解初始化程序的答案是合理的。

@tomdale:“不可能在实例初始化器中延迟应用程序的准备状态,因为根据定义,实例初始化器只在应用程序完成引导后才运行。

应用程序引导语义的侧边栏:“应用就绪”(如deferReadiness()和advanceReadiness())指的是应用程序的所有代码是否已经加载。一旦加载了所有代码,就会创建一个新实例,即您的应用程序。

要重新声明,在浏览器中运行的Ember应用程序的生命周期是:

  1. 余烬负荷。
  2. 您可以创建一个全局的Ember.Application实例(例如应用程序)。
  3. 此时,您的类还没有被加载。
  4. 在计算JavaScript文件时,在应用程序上注册类(例如,App.MyController = Ember.Controller.extend(…);)
  5. Ember等待DOM就绪,以确保通过<script>标记包含的所有<script>都已加载。
  6. 启动程序正在运行。
  7. 如果您需要延迟加载代码或等待其他设置,则可以调用deferReadiness()
  8. 一旦加载了所有内容,就可以调用advanceReadiness()
  9. 此时,我们说Application已经准备好了;换句话说,我们已经告诉Ember所有的类(组件、路由、控制器等等)。组成这个应用程序的东西都被加载了。
  10. 将创建应用程序的新实例,并运行实例初始化器。
  11. 路由开始,UI呈现到屏幕上。

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

在初始化器中使用deferReadiness()是许多人所依赖的不幸的黑客。我称之为黑客,因为与路由器中的模型承诺链不同,它破坏了诸如错误和加载子状态之类的东西。通过阻止初始化器中的呈现,IMO为用户创造了更糟的体验,因为如果承诺缓慢或拒绝,他们将不会看到加载或错误子状态,而且我看到的大多数代码根本没有任何错误处理代码。这将导致应用程序只出现一个空白的白屏幕,而不会向用户显示发生了什么不好的事情。“

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31027553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档