AngularJS: регистрация службы вручную

У меня есть страница с несколькими виджетами. После загрузки страницы я получаю список виджетов, который содержит URL-адрес. Затем я ng-включаю URL-адрес.

У каждого виджета есть собственный контроллер, который загружается с помощью тега <script> в HTML-коде виджета. Поскольку список виджетов является динамическим, я не могу загрузить файлы .js виджета при загрузке страницы. (когда я это делаю, он работает нормально.) Я продолжаю получать сообщение об ошибке.

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

Вот мой HTML:

<script src="/widget/fooWidget.js"></script>

<div ng-controller="FooWidgetCtrl">
    ...
</div>

А вот мой fooWidget.js: (у меня есть модуль Widgets, определенный в файле, который загружается при загрузке страницы)

Widgets.service('FooWidgetSvc', function($http) {
    this.getSomething = function() {
        // $http methods
    }
});

function FooWidgetCtrl($scope, $http, FooWidgetSvc) {
    FooWidgetSvc.getSomething();
    return $scope.FooWidgetCtrl = this;
}

И я получаю следующую ошибку:

Error: Unknown provider: FooWidgetSvcProvider <- FooWidgetSvc
at Error (<anonymous>)

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

Я могу сделать плункер, если это поможет.

ОБНОВЛЕНИЕ

Спасибо за ответы. Я создал плункер, чтобы проиллюстрировать мою проблему: http://plunker.co/edit/iKzwnlZ7bNDjmR05qGDC

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


person dob    schedule 01.07.2013    source источник
comment
Пожалуйста, поделитесь plunkr, я создал сервисы в модулях, которые, как я полагаю, не столкнулся с какими-либо проблемами, я думаю, что проблема звучит так, будто у сервиса просто нет определения до того, как на него ссылаются. Контроллер, который использует службу, просто не может быть создан до создания службы, иначе провайдер не сможет найти его, когда попытается выполнить внедрение зависимостей.   -  person shaunhusain    schedule 02.07.2013
comment
@shaunhusain, спасибо за ответ. Я только что добавил plunkr. Сначала я создаю службу, затем контроллер. Я могу вручную зарегистрировать контроллер в модуле Widgets, но не могу найти способ вручную зарегистрировать службу.   -  person dob    schedule 03.07.2013
comment
Посмотрите, поможет ли этот ответ: stackoverflow.com/questions/15250644/   -  person Brian Lewis    schedule 03.07.2013


Ответы (2)


Ладно, ребята, извините за беготню. Наконец, я прочитал документацию столько раз, что понял из.

Я пытался создать службу после того, как Angular все переварил, а это значит, что мне пришлось вручную добавлять контроллеры к модулю, используя $controllerProvider, и службы к модулю, используя $provide:

var WidgetsControllerProvider = null;
var WidgetsProvider = null;

var Widgets = angular.module('widgets', [], function($controllerProvider, $provide) {
  WidgetsControllerProvider = $controllerProvider;
  WidgetsProvider = $provide;
});

Теперь я могу вручную добавлять сервисы и контроллеры следующим образом:

WidgetsProvider.factory('blergWidgetSvc', function($http) {
  return {
    getCountry: function(callback) {
      // code
    }
  };
});

WidgetsControllerProvider.register('blergWidgetCtrl', function($scope, blergWidgetSvc) {
    // code
});

Я развил и обновил plunker, чтобы показать свое решение.

person dob    schedule 03.07.2013
comment
Если у вас достаточно баллов, вы должны принять свой собственный ответ, если это в конечном итоге то, что работает лучше всего, у меня сейчас нет времени, чтобы прочитать его, но я вернусь позже. Рад, что ты разобрался. - person shaunhusain; 03.07.2013
comment
@shaunhusain, stackoverflow не позволяет мне сразу принять мой собственный ответ. Приму через 45 минут :) - person dob; 04.07.2013

Это работает для вас?

Widgets.service('FooWidgetSvc', function($http) {
    this.getSomething = function() {
        // $http methods
    }
}).controller('FooWidgetCtrl', function($scope, $http, FooWidgetSvc) {
    FooWidgetSvc.getSomething();
}
person Brian Lewis    schedule 02.07.2013
comment
Работает, если я прикрепляю файл /widget/fooWidget.js к шапке, но не работает, если он находится внутри fooWidget.html. - person dob; 02.07.2013
comment
Я только что выложил плунжер. Спасибо, что заглянули! - person dob; 03.07.2013