我们正在经历更新我们的成员-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();
});
}现在建议的是,我将其划分为一个“普通”初始化器来注册购物篮对象,以及一个实例初始化器来获取存储并调用我们的API服务器。但是,这样做,我将无法访问实例初始化器中的注册表,从而根据我的承诺注册返回的对象,然后将其注入到控制器中。我想我想错了,但我还没能把我的头绕过去。有什么建议我应该如何通过更新这个吗?
发布于 2015-06-25 07:39:41
我认为在这里发布@tomdale解释作为帮助其他人理解初始化程序的答案是合理的。
@tomdale:“不可能在实例初始化器中延迟应用程序的准备状态,因为根据定义,实例初始化器只在应用程序完成引导后才运行。
应用程序引导语义的侧边栏:“应用就绪”(如deferReadiness()和advanceReadiness())指的是应用程序的所有代码是否已经加载。一旦加载了所有代码,就会创建一个新实例,即您的应用程序。
要重新声明,在浏览器中运行的Ember应用程序的生命周期是:
App.MyController = Ember.Controller.extend(…);)<script>标记包含的所有<script>都已加载。deferReadiness()。advanceReadiness()。Application已经准备好了;换句话说,我们已经告诉Ember所有的类(组件、路由、控制器等等)。组成这个应用程序的东西都被加载了。如果您想延迟显示UI,因为需要执行一些运行时设置(例如,您希望在应用程序开始运行之前打开一个WebSocket ),则正确的解决方案是在ApplicationRoute中使用beforeModel/model/afterModel钩子。所有这些挂钩都允许您返回一个承诺,该承诺将防止对子路由进行评估,直到它们解决为止。
在初始化器中使用deferReadiness()是许多人所依赖的不幸的黑客。我称之为黑客,因为与路由器中的模型承诺链不同,它破坏了诸如错误和加载子状态之类的东西。通过阻止初始化器中的呈现,IMO为用户创造了更糟的体验,因为如果承诺缓慢或拒绝,他们将不会看到加载或错误子状态,而且我看到的大多数代码根本没有任何错误处理代码。这将导致应用程序只出现一个空白的白屏幕,而不会向用户显示发生了什么不好的事情。“
https://stackoverflow.com/questions/31027553
复制相似问题