我正在将基于全局变量的实时Ember应用程序转换为使用ember-cli的基于es6的应用程序。在我的应用程序中,我需要经常了解当前的路线。在全局版本中,我正在这样做。
全局模式
var MyApp = Ember.Application.create({
currentRoute : ''
});
MyApp.Route = Ember.Route.extend({
actions : {
didTransition : function () {
MyApp.set('currentRoute', this);
}
}
});
然后我可以在我的会话或离线控制器中执行MyApp.get('currentRoute')
,确定在发生特定事件时如何/在何处转换。
使用ember-cli时,我导入应用程序以便能够从必要的控制器中引用它。
import MyApp from "../app";
但事实证明MyApp.currentRoute
,MyApp.get
和MyApp.set
都是未定义。
部分我认为这是ember-cli中的一个错误,即应用程序实例不再绑定getter和setter。我的一部分意识到在应用程序实例上存储东西并不是一个很好的做法。
我可以通过将MyApp.get
和MyApp.set
的所有实例分别转换为Ember.get(MyApp, ...)
和Ember.set(MyApp, ...)
来解决此问题,但我想我先在这里问这个问题似乎要么是Ember-Cli的问题,要么是有更好的推荐方法来达到我需要的东西。
答案 0 :(得分:6)
如果查看app.js
(您要导入的内容),它不是您的应用程序实例,而是导出Ember.Application
的子类。这就是get
等人无法获得的原因。
var App = Ember.Application.extend({ <----- NOT create
modulePrefix: config.modulePrefix,
podModulePrefix: config.podModulePrefix,
Resolver: Resolver
});
export default App;
要从路线中获取实际的应用程序实例,请使用:
Ember.getOwner(this).lookup('application:main')