Javascript Emberjs中的实例初始值设定项
我们正在经历将ember cli应用程序更新到其最新迭代的漫长过程。我们落后了很多。我正处于引入实例初始值设定项的阶段,我感觉这将打破我目前实现某个初始值设定项的方式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
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应用程序的生命周期是:
App.MyController=Ember.Controller.extend(…);
)
标记包含的内容deferReadiness()
advanceReadiness()
应用程序是
准备好了;换句话说,我们已经告诉Ember所有的类
(组成应用程序的组件、路由、控制器等)包括
上膛了
ApplicationRoute
中的beforeModel/model/afterModel
钩子。所有这些钩子都允许您返回一个承诺,在解决子路由之前,将阻止对其进行评估
使用在初始值设定项中是一种不幸的黑客行为,许多人已经开始依赖它了。我称之为黑客行为,因为与路由器中的模型承诺链不同,它会破坏错误和加载子状态之类的东西。在我看来,通过阻止初始值设定项中的呈现,你会给用户带来更糟糕的体验,因为他们看不到加载如果承诺很慢或被拒绝,则执行或错误替换,并且我看到的大多数代码根本没有任何错误处理代码。这会导致应用程序中断,只有一个空白的白色屏幕,并且不会向用户表明发生了不好的事。”我认为@tomdale的这一解释对您很有用,谢谢@artych。这解决了一些非常有效的问题,并让我思考了当前的实现。我将尝试以另一种方式完成我想做的事情。