Ember-CLI -如何访问应用程序类

s4n0splo  于 2022-11-23  发布在  其他
关注(0)|答案(2)|浏览(142)

以前当我开发ember应用程序时,我使用App作为我的全局对象,每个类都存储在这个大对象中。
就像这样

window.App.MyModel = Em.Object.extend({});

在浏览器控制台中,我可以

App.MyModel.create();

所以对我来说访问MyModel类真的很容易。
现在我开始尝试Ember-CLI,我对这类工具没有太多经验。我按照文档创建了我的模型服务,如下所示。

var Service = Ember.Object.extend({});
export default Service

但是现在,如何从浏览器控制台访问服务类?我发现的唯一方法是:

App.__container__.resolve('model:service')

但我不太喜欢它。有更好的方法吗?顺便问一下,你能解释一下导出是如何工作的吗?或者有一些来源(文档,文章),我可以研究它?
非常感谢您的回复。

but5z9lq

but5z9lq1#

如果您的目标是在应用程序的大多数地方都可以使用某些内容,则通常需要在容器上注册它。
有多种方法可以访问容器,您所找到的方法并不理想,这是正确的。流传的笑话是“任何时候您直接访问__container__时,我们都需要添加更多下划线。”
要直接控制如何在容器上注册和注入内容,通常需要使用初始化器。在ember-cli中使用初始化器非常简单,它们会自动执行。
查看文档后,您可以看到您可以将应用程序的容器作为参数访问,从而可以安全地对其进行操作。
一旦你有了容器的访问权限,你就可以使用register和inject来使内容在特定的位置变得容易使用。这里介绍了这一点。需要注意的是,从你的应用上下文(浏览器控制台)之外访问容器内部的内容将需要使用App.__container__,这是预期的使用模式。
您运行的export是一个ES6模块系统构造,它不是Ember特定的。使用ES6 module transpiler可以给予您很好地了解“我们今天就可以做”类型的JavaScript中的内容。

e3bfsja2

e3bfsja22#

对于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

相关问题