Я разрабатываю приложение angularjs, которое должно расширяться с помощью «добавок». В упрощенном случае addin представляет собой пару файлов js + html. Каждое дополнение должно иметь один или несколько контроллеров и один или несколько заводов. Ниже приведен пример добавления с одного контроллером и одного завода:Динамическая загрузка контроллера + фабрика в angularjs
JS:
angular.module('addins.basic', [])
angular.module('addins.basic').factory('BasicAddinFactory', [BasicAddinFactory]);
function BasicAddinFactory()
{
var fact =
{
Invoke: function()
{
console.log('BasicAddinFactory.Invoke');
},
GetClients: function()
{
return ["aa", "bb"];
}
}
return fact;
}
angular.module('addins.basic').controller('BasicAddinController', ['$scope', 'BasicAddinFactory', BasicAddinController]);
function BasicAddinController($scope, $injector, addin)
{
//var injector = angular.injector(['ng', 'addins.basic'])
//var addin = injector.get('BasicAddinFactory');
$scope.expr = 'BasicAddinFactory: ' + addin.GetClients()[0];
}
HTML:
<div ng-controller="BasicAddinController">
<input type="text" ng-model="expr">
<span>{{ expr }}</span>
</div>
Загрузка надстройка динамически не проблема с использованием методов, широко описана в Интернете : добавив JS-скрипт и HTML в DOM. Все загружается нормально, пока я не попытаюсь ввести зависимость от BasicAddinFactory в BasicAddinController. После этого я получил ошибку во время динамической загрузки: Неизвестный поставщик: addinProvider < - addin.
Интересная часть состоит в том, что, если я не вставляю явную зависимость, все загружается нормально, и я даже могу получить доступ к заводскому экземпляру из контроллера (или из родительского кода, который загружает «добавление»), используя код комментария в примере выше. Но это довольно уродливо, и я действительно не хочу, чтобы так оно было.
Я был бы признателен, если бы кто-нибудь мог указать мне, где моя ошибка.
Спасибо.
UPDATE: Sample plunk
Спасибо за ответ. К сожалению, это не так. Добавление сервисов, которые не используются в контроллере, ничего не меняет. Если они правильно введены - они не нарушают «компиляцию». – Amid
Дело не в том, что они не используются, а в том, что порядок массива зависимостей имеет значение. Пример: http://jsfiddle.net/TwoToneBytes/022mnqzp/3/ –
Прошу прощения. Это была опечатка, когда я готовил код для stackowerflow. Вот фрагмент, который иллюстрирует проблему: [образец] (http://plnkr.co/edit/vys1yhNQYA8ejZMSXSS9?p=preview). Попробуйте удалить инъекцию на завод, и он отлично работает. – Amid