2015-10-06 2 views
0

У меня есть большой список служб и контроллеров, которые создаются, когда сайт загружается первым, а затем я вызываю angular.bootstrap. Затем, позже, я хотел бы запустить какой-то произвольный код, который может быть введен в зависимость. То, как я это делаю, - это создать функцию, указав ее зависимости с аннотациями, получить инжектор для модуля, который я использовал, а затем вызвать вызов этой функции.angularjs: invoke создает новые услуги

Я использую requirejs для загрузки этого плагина и любого другого плагина, так что это то, что возвращается из модуля. код выглядит следующим образом

define [ 
    'scripts/inherits/basePlugin' 
] , (BasePlugin) -> 
    # The explicit block lists the angular services/factories you need 
    # all game logic/entity classes go inside this block 
    explicit = (Options, Renderer) -> 
     class Checkers extends BasePlugin.Plugin 
      constructor:() -> 
       super() 
       @checkersOptions = [ 
        [ 
         "checkbox", 
         "test checkbox", 
         false 
        ], 
        [ 
         "slider", 
         "test slider", 
         0, 3, 1 
        ], 
        [ 
         "textbox", 
         "test textbox", 
         "this is some text" 
        ], 
        [ 
         "dropdown", 
         "test dropdown", 
         ["blah", "blah2", "blah3"], 
         "blah2" 
        ] 
       ] 
       Options.addPage "Checkers", @checkersOptions 

      selectEntities: (renderer, turn, x, y) -> 

      verifyEntities:(renderer, turn, selection) -> 

      getName:() -> 'Checkers' 

      predraw: (turn, dt, renderer) -> 

      postdraw: (turn, dt, renderer) -> 

      resize: (renderer) -> 

      loadGame: (@gamedata, renderer) -> 

      getSexpScheme:() -> null 

     return Checkers 

    # the dependencies are manually injected here 
    explicit.$inject = ['Options', 'Renderer'] 
    $injector = angular.injector(['webvisApp']) 

    # the constructor function for the main checkers object is returned here 
    return $injector.invoke(explicit) 

Теперь в конце концов, я пытаюсь вернуть класс прототип «Шашки» здесь, который имеет доступ к угловым служб «Параметры» и «Renderer». В конце, когда я вызываю invoke, он запускается без жалобы, но по какой-то причине две службы повторно создаются, как в конструкторах для этих двух служб, вызываются снова, уничтожая любые данные, которые они ранее имели. Почему вызов вызывает восстановление этих служб?

EDIT: РЕШЕНИЕ: Оказалось, что функция форсунки создает новые инжекторы вместо использования в вашем модуле. мое решение было это:

# make your module 
webvisApp = angular.module 'webvisApp', [ 
    'ngCookies' 
    'ngSanitize' 
    'ngRoute' 
    'ui.bootstrap' 
] 

# attach injector to publicly accessible member 
webvisApp.run ($injector) -> 
    webvisApp.injector = $injector 

# create your controllers and services 

# bootstrap the application 
angular.bootstrap document, ['webvisApp'] 

Затем вызвать некоторую функцию с зависимостями:

needsDependencies = (Renderer, Options) -> 
    #do stuff 

needsDependencies.$inject = ['Renderer', 'Options'] 
webvisApp = angular.module('webvisApp') 
webvisApp.injector.invoke needsDependencies 

ответ

1

Вы создаете новый экземпляр инжектора с angular.injector, и она отличается от той, которую вы получили с angular.bootstrap в другом месте. Каждый из этих экземпляров инжектора создает свои собственные экземпляры службы.

Я не совсем уверен в архитектуре приложения, но я предполагаю, что вы должны предоставить инжектор из загруженного приложения во все модули.

+0

Именно так. Не совсем понимаю, какой вариант использования для такого нового инжектора, но что бы это ни было. Во время блока выполнения модуля, после начальной загрузки и всех поставщиков, я прикрепляю к нему модуль $ injector, например webvisApp.injector = $ injector. и тогда я смог ввести абортивные функции, такие как webvisApp.injector.invoke funcName. Работал как шарм. Благодаря! – FatalCatharsis