Ember.js ember cli App.get/App.set抛出未定义

Ember.js ember cli App.get/App.set抛出未定义,ember.js,ember-cli,ecmascript-6,Ember.js,Ember Cli,Ecmascript 6,我正在将基于globals的实时Ember应用程序转换为利用Ember cli的基于es6的应用程序。在我的应用程序中,我需要经常了解当前路线。在globals版本中,我就是这么做的 全局模式 var MyApp = Ember.Application.create({ currentRoute : '' }); MyApp.Route = Ember.Route.extend({ actions : { didTransition : function ()

我正在将基于globals的实时Ember应用程序转换为利用Ember cli的基于es6的应用程序。在我的应用程序中,我需要经常了解当前路线。在globals版本中,我就是这么做的

全局模式

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中的一个bug,即应用程序实例不再具有绑定的getter和setter。我的一部分意识到,在应用程序实例上存储东西也不是一个很好的做法


我可以通过将
MyApp.get
MyApp.set
的所有实例分别转换为
Ember.get(MyApp,…)
Ember.set(MyApp,…)
来解决这个问题,但我想我应该先问一下这里,因为这似乎是Ember Cli的问题,或者是有更好的推荐方法来实现我的需要。

如果您查看
app.js
(您正在导入的内容),它不是您的应用程序实例,而是导出
Ember.application
的子类。这就是为什么it上没有
get
等功能

var App = Ember.Application.extend({   <----- NOT create
    modulePrefix: config.modulePrefix,
    podModulePrefix: config.podModulePrefix,
    Resolver: Resolver
});

export default App;

使用cli时,您不再需要使用myapp.stuff,而是导出Ember.route.extend({//your code}),并使用this.set代替myapp.set。您只需要导入Ember,
import Ember from'Ember'如果您需要帮助迁移itI,我也有这个问题。我正在将一个ember starter kit应用程序迁移到ember cli,但我遇到了以下问题:我曾将当前用户的信息存储在应用程序对象的属性中。因此,我在整个应用程序中使用了
App.get('currentUser')
,在登录/注销时使用了
App.set('currentUser',x)
。现在这不起作用了。我可以申请什么作为类似用途的替代方案?抄送@BasementKeyboardHero@Ernesto您必须了解并感谢@BasementKeyboardHero,依赖注入正是我避免全局应用程序属性所需要的。如果你把这篇文章作为对这个问题的回答,而不是仅仅在评论中建议使用它,那对其他人来说是件好事。无论如何谢谢你!在我问这个问题后的几个月里,我已经把这一切都弄明白了,但是谢谢你在这过程中为其他人提供的答案!是的。我最讨厌的莫过于对堆栈溢出问题的隐藏解决方案。请注意,自Ember 1.0.0以来,这种解决方案一直被弃用
this.container
应替换为
Ember.getOwner(this)
Ember.getOwner(this).lookup('application:main')