Javascript Emberjs中的实例初始值设定项

Javascript Emberjs中的实例初始值设定项,javascript,ember.js,dependency-injection,Javascript,Ember.js,Dependency Injection,我们正在经历将ember cli应用程序更新到其最新迭代的漫长过程。我们落后了很多。我正处于引入实例初始值设定项的阶段,我感觉这将打破我目前实现某个初始值设定项的方式 export function initialize(container, application) { var store = container.lookup('store:main'); // We need a basket to be present when // the application load

我们正在经历将ember cli应用程序更新到其最新迭代的漫长过程。我们落后了很多。我正处于引入实例初始值设定项的阶段,我感觉这将打破我目前实现某个初始值设定项的方式

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();
  });
}

现在建议我将其拆分为一个“普通”初始值设定项来注册basket对象,以及一个实例初始值设定项来获取存储并调用我们的API服务器。但是,如果这样做,我将无法访问实例初始值设定项中的注册表,以注册从承诺中返回的对象,然后将其注入控制器。我想我对这一切的想法都是错误的,但我还没有完全理解它。有什么建议我应该如何更新这个吗?

我认为在这里发布是合理的,以帮助其他人理解初始值设定项

@tomdale:“不可能在实例初始值设定项中延迟应用程序就绪,因为根据定义,实例初始值设定项仅在应用程序完成引导后运行

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

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

  • 余烬负载
  • 创建一个Ember.Application全局实例(例如。 应用程序)
  • 此时,还没有加载任何类
  • 在计算JavaScript文件时,在 应用程序(例如,
    App.MyController=Ember.Controller.extend(…);

  • Ember等待DOM就绪,以确保所有JavaScript 已加载通过
    标记包含的内容

  • 初始化程序正在运行
  • 如果需要延迟加载代码或等待其他设置,可以调用
    deferReadiness()
  • 加载所有内容后,可以调用
    advanceReadiness()
  • 此时,我们说
    应用程序是
    准备好了;换句话说,我们已经告诉Ember所有的类
    (组成应用程序的组件、路由、控制器等)包括
    上膛了
  • 将创建应用程序的新实例,并且 初始化程序正在运行
  • 路由开始,UI呈现给 屏幕
  • 如果您想延迟显示UI,因为需要进行一些运行时设置(例如,您想在应用程序开始运行之前打开WebSocket),正确的解决方案是使用
    ApplicationRoute
    中的
    beforeModel/model/afterModel
    钩子。所有这些钩子都允许您返回一个承诺,在解决子路由之前,将阻止对其进行评估


    使用
    在初始值设定项中是一种不幸的黑客行为,许多人已经开始依赖它了。我称之为黑客行为,因为与路由器中的模型承诺链不同,它会破坏错误和加载子状态之类的东西。在我看来,通过阻止初始值设定项中的呈现,你会给用户带来更糟糕的体验,因为他们看不到加载如果承诺很慢或被拒绝,则执行或错误替换,并且我看到的大多数代码根本没有任何错误处理代码。这会导致应用程序中断,只有一个空白的白色屏幕,并且不会向用户表明发生了不好的事。”

    我认为@tomdale的这一解释对您很有用,谢谢@artych。这解决了一些非常有效的问题,并让我思考了当前的实现。我将尝试以另一种方式完成我想做的事情。