以前,当我开发ember应用程序时,我使用App作为我的全局对象,每个类都存储在这个大对象中。
喜欢这个
window.App.MyModel = Em.Object.extend({});
在浏览器控制台中,我能够做到
App.MyModel.create();
所以我很容易访问MyModel类。
现在我开始使用Ember-CLI进行实验,我对这种工具没有多少经验。我按照文档编写了这样的模型服务。
var Service = Ember.Object.extend({});
export default Service
但是现在,如何从浏览器控制台访问Service类? 我发现的唯一方法是:
App.__container__.resolve('model:service')
但我不喜欢它。还有更好的方法吗?顺便问一下,您能解释一下出口是如何运作的吗?或者是否有一些我可以研究它的来源(文档,文章)?
非常感谢您的回复。
答案 0 :(得分:9)
如果您的目标是在整个应用程序的大多数地方都有可用的东西,那么您通常希望在容器上注册它。
有多种方法可以访问容器,而且你找到的那个方法不太理想。正在运行的笑话是“只要您直接访问__container__
,我们就需要添加更多下划线。”
要直接控制容器上的注册事项并将其注入容器,您通常需要使用initializer。 Using initializers in ember-cli非常简单,它们会自动为您执行。
检查documentation您可以看到您可以访问应用程序的容器作为参数,允许您以安全的方式操作它。
有权访问容器后,您可以使用register和inject在特定位置轻松获取内容。这是introduced here。请注意,从应用程序(浏览器控制台)的上下文外部访问容器内部的内容将需要使用App.__container__
,这是预期的使用模式。
您遇到的export
是ES6模块系统构造,它不是特定于Ember的。使用ES6 module transpiler可以让您更好地了解“今天我们可以做到这一点”JavaScript的内容和内容。
答案 1 :(得分:0)
对于ember 3.22,可以像这样访问应用程序类:
Ember.Namespace.NAMESPACES[1]._applicationInstances.values().next().value.lookup('service:state-events')
请注意,您可能需要将NAMESPACES[1]
中的索引修改为1
以外的其他索引。当返回true时,您可以确定应用程序是哪个名称空间:
Ember.Namespace.NAMESPACES[1] instanceof Application
这种方法是ember-inspector访问ember应用程序的方式:https://github.com/emberjs/ember-inspector/blob/50db91b7bd26b12098cae774a307208fe0a47d75/ember_debug/main.js#L163-L168