5

以前我开发 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')

但我不太喜欢它。有没有更好的办法?顺便说一句,你能解释一下出口是如何运作的吗?或者是否有一些我可以研究的来源(文档、文章)?

非常感谢您的回复。

4

2 回答 2

9

如果您的目标是在整个应用程序的大多数地方都有可用的东西,您通常希望在容器上注册它。

有多种方法可以访问容器,您是正确的,因为您找到的方法不太理想。流行的笑话是“任何时候您直接访问__container__我们都需要添加更多下划线。”

要直接控制事物如何在容器上注册并注入到容器中,您通常需要使用初始化程序在 ember-cli中使用初始化程序非常简单,它们会自动为您执行。

查看文档,您可以看到您可以访问应用程序的容器作为参数,它允许您以安全的方式对其进行操作。

一旦您可以访问容器,您就可以使用registerinjection使内容在特定位置轻松可用。这是在这里介绍的。需要注意的是,从应用程序上下文(浏览器控制台)外部访问容器内部的内容将需要使用,App.__container__这是预期的使用模式。

export遇到的是一个 ES6 模块系统结构,它不是 Ember 特定的。使用ES6 模块转译器可以让您很好地了解“我们今天可以做到”类型的 JavaScript 中的内容和输出内容。

于 2014-04-17T15:29:19.683 回答
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

于 2020-11-04T17:01:11.193 回答