Javascript 如何访问Ember global';App&x27;Ember CLI应用程序中的变量?
我正在使用Ember CLI创建一个Ember应用程序。我有一个调用我创建的组件的视图。我正在尝试访问全局应用程序变量以创建组件并将其插入布局 错误:未捕获引用错误:未定义应用程序 我该如何解决这个问题 app.jsJavascript 如何访问Ember global';App&x27;Ember CLI应用程序中的变量?,javascript,ember.js,ember-cli,Javascript,Ember.js,Ember Cli,我正在使用Ember CLI创建一个Ember应用程序。我有一个调用我创建的组件的视图。我正在尝试访问全局应用程序变量以创建组件并将其插入布局 错误:未捕获引用错误:未定义应用程序 我该如何解决这个问题 app.js import Ember from 'ember'; import Resolver from 'ember/resolver'; import loadInitializers from 'ember/load-initializers'; Ember.MODEL_FACTOR
import Ember from 'ember';
import Resolver from 'ember/resolver';
import loadInitializers from 'ember/load-initializers';
Ember.MODEL_FACTORY_INJECTIONS = true;
var App = Ember.Application.extend({
modulePrefix: 'client-web', // TODO: loaded via config
Resolver: Resolver
});
loadInitializers(App, 'client-web');
export default App;
import Ember from 'ember';
export default Ember.Component.extend({
templateName: 'components/freestyle-chart',
didInsertElement: function() {
console.log('Inserted the component.');
}
});
item table.js(这是一个视图)
app/components/freestyle chart.js
import Ember from 'ember';
import Resolver from 'ember/resolver';
import loadInitializers from 'ember/load-initializers';
Ember.MODEL_FACTORY_INJECTIONS = true;
var App = Ember.Application.extend({
modulePrefix: 'client-web', // TODO: loaded via config
Resolver: Resolver
});
loadInitializers(App, 'client-web');
export default App;
import Ember from 'ember';
export default Ember.Component.extend({
templateName: 'components/freestyle-chart',
didInsertElement: function() {
console.log('Inserted the component.');
}
});
我可以想出两种方法。首先是手动将应用程序置于全局范围
var App = window.App = Ember.Application.extend();
第二种方法是将应用程序导入到您的视图中:
import App from './path/to/app/file';
只有当Ember CLI支持循环引用时,才可能使用后者。官方的ES6规范支持它们,但许多Transpiler不支持(我的不支持)
然而,我不认为这是你的根本担忧。在大多数情况下,您不应该在Ember CLI中访问全局变量。与其将
FreestyleChartComponent
放在App
名称空间中,为什么不把它放在一个模块中,然后像其他模块一样导入呢?全局变量是不可避免的(我今天就体验到了这一点),但您应该尽量减少它们。导入您想要的组件:
import FreestyleChartComponent from 'app_name/app/components/freestyle-chart';
我同意你不应该通过全局名称空间访问你的应用程序,但是
ember cli
实际上使你的应用程序成为一个全局应用程序,应用程序的名称就是变量的名称
如果在ember cli
项目中打开/app/index.html
,您应该会看到底部有一个脚本
标记,看起来像
<script>
window.YourAppName = require('your-app-name/app')['default'].create(YourAppNameENV.APP);
</script>
window.YourAppName=require('your-app-name/app')['default'].create(yourappnameev.app);
在上面的示例中,
YourAppName
将是您的应用程序作为一个全局应用程序提供没有直接的方法可以做到这一点,因为Ember CLI希望您使用公共API及其给定组件,而不是直接访问应用程序实例
大多数解决方案都包括使应用程序实例成为全局的,而这一个则不是。我没有对此进行测试,但我认为这应该有效:
appname/utils/application.js
appname/instance初始值设定项/application.js
现在
从“appname/utils/application”导入应用程序代码>
并在需要应用程序实例的任何文件中使用application.instance
。经过Ember 3.7的测试
import App from 'app-name/app';
应用程序名称
必须替换为应用程序的名称(我猜是package.json中的名称)。我尝试了第一个选项,但没有成功。第二个已编译,但现在的错误是“UncaughtTypeError:无法读取未定义的属性'create'。如何创建模块?找不到太多关于这个的信息。很抱歉有新来的问题。另外,假设我在这里甚至没有问这个问题,您将如何在Ember CLI应用程序中动态创建组件?我当前的脚本正确吗?如果第一个选项不起作用,那么你做了其他错误的事情。一个特定的错误可以帮助我们找到那个问题。至于第二个不起作用,听起来像是App.FreestyleChartComponent
不存在。如果没有更多的代码,我真的无法帮助您诊断。我基本上如下所示:。除了我的应用程序是使用Ember CLI创建的这一事实之外,没有其他不同之处。您能否向我们展示您声明Freestyle ChartComponent
的代码?我尝试了这一点,现在它可以找到该组件了。谢谢但是,现在的错误是:“断言失败:不能追加到现有的EMBE.VIEW。我刚刚将视图更改为ContainerView,它现在显示“未捕获的错误:断言失败:您试图附加到([object object]),但它不在DOM中”。视图的模板也不在页面上。你应该在另一个问题中询问,而不是在这里的评论中。这与最初的问题无关。我已经删除了我的答案,因为它没有帮助。对不起,伙计。
import App from 'app-name/app';