Внедрение функции с инициализатором в ember-cli

У меня есть приложение, построенное на Ember-cli. Я пытаюсь внедрить метод во все маршруты, контроллеры и представления. Я знаю, что могу использовать каталог app/utils и импортировать модуль метода во все файлы, которые его вызывают, но я бы хотел, чтобы метод был доступен автоматически. Следовательно, я решил внедрить метод с помощью инициализатора.

Инициализатор выглядит так:

export default {
  name: 'injectMethod',

  initialize: function(container, app) {
    var someFunction = function(message) {

    };

    app.register('function:main', someFunction);

    Em.A(['route', 'controller', 'view']).forEach(function(place) {
      app.inject(place, 'someFunction', 'function:main');
    });
  }
};

В результате появляется следующее сообщение об ошибке: Uncaught TypeError: undefined is not a function. Ошибка исчезает при удалении строки app.inject().

По-разному ли инициализаторы обрабатываются в ember-cli и / или что-то в приведенном выше коде неверно? Или это лучший способ достичь моей цели, чем использование инициализатора?


person Duncan Walker    schedule 21.07.2014    source источник
comment
Донно, как еще работает ember-cli .. но здесь ли приложение доступно во всем мире?   -  person thecodejack    schedule 21.07.2014
comment
Одна из целей модулей ember-cli / es6 - удалить все из глобальных пространств имен. App недоступен глобально, потому что вы регистрируете отдельные модули.   -  person Duncan Walker    schedule 21.07.2014


Ответы (1)


Ember ожидает, что вы зарегистрируете фабрику, которую он сможет создавать экземпляры, используя метод create. Если вы передаете экземпляр (или просто метод), вам нужно будет сказать Ember, чтобы он не пытался его создать, а просто использовал переданный экземпляр.

export default {
  name: 'injectMethod',

  initialize: function(container, app) {
    var someFunction = function(message) {

    };

    app.register('function:main', someFunction, {instantiate: false});

    Em.A(['route', 'controller', 'view']).forEach(function(place) {
      app.inject(place, 'someFunction', 'function:main');
    });
  }
};

Пример: http://emberjs.jsbin.com/xaboliwu/1/edit.

person Kingpin2k    schedule 21.07.2014
comment
Об этом также есть хорошее подробное сообщение в блоге по адресу balinterdi.com/2014/05/01/ - person HeroicEric; 21.07.2014
comment
Идеально. Спасибо ребята! - person Duncan Walker; 21.07.2014