ember-cli App.get / App.set throw undefined

Я конвертирую приложение Ember в реальном времени на основе глобальных переменных в приложение на основе es6, которое использует ember-cli. В моем приложении мне довольно часто нужно знать текущий маршрут. В версии 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, заключающаяся в том, что экземпляр приложения больше не имеет связанных геттеров и сеттеров. Часть меня понимает, что хранить что-либо в экземпляре приложения - не лучшая практика.

Я мог бы обойти эту проблему, преобразовав все экземпляры MyApp.get и MyApp.set в Ember.get(MyApp, ...) и Ember.set(MyApp, ...) соответственно, но я подумал, что сначала спрошу здесь, так как это, похоже, проблема с Ember-Cli или что-то еще, где есть лучший рекомендуемый способ чтобы достичь того, что мне нужно.


person runspired    schedule 24.10.2014    source источник
comment
Вам больше не нужно myapp.stuff при использовании cli, вместо этого экспортируйте Ember.route.extend ({// ваш код}) и вместо MyApp.set используйте this.set   -  person Patsy Issa    schedule 25.10.2014
comment
Единственное, что вам нужно импортировать, это ember, import Ember from 'ember'; свяжитесь со мной в чате, если вам нужна помощь в переносе Это   -  person Patsy Issa    schedule 25.10.2014
comment
У меня тоже такая проблема. Я переношу приложение ember-starter kit на ember-cli, и у меня возникла следующая проблема: я раньше хранил информацию о текущем пользователе в свойстве объекта App. Поэтому я использовал App.get('currentUser') во всем приложении и App.set('currentUser', x) при входе / выходе. Теперь это не работает. Что я могу применить в качестве альтернативы для аналогичного использования? cc @BasementKeyboardHero   -  person Ernesto    schedule 12.01.2015
comment
@Ernesto Вам нужно будет изучить внедрение зависимости и инициализаторы   -  person Patsy Issa    schedule 12.01.2015
comment
Спасибо @BasementKeyboardHero, внедрение зависимостей - это именно то, что мне нужно, чтобы избежать глобальных свойств приложения. Для других будет хорошо, если вы разместите это как ответ на этот вопрос, а не просто предложите его использование в комментариях. Спасибо, в любом случае!   -  person Ernesto    schedule 12.01.2015


Ответы (1)


Если вы посмотрите на 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')
person atomkirk    schedule 11.02.2015
comment
За месяцы, прошедшие с тех пор, как я спросил об этом, я во всем разобрался, но спасибо за ответ всем остальным на этом пути! - person runspired; 12.02.2015
comment
Ага. Ничего я ненавижу больше, чем скрытое разрешение вопроса о переполнении стека. - person atomkirk; 12.02.2015
comment
Обратите внимание, что это устарело с Ember 1.0.0. this.container следует заменить на Ember.getOwner(this) - person Henridv; 22.06.2018