У меня есть существующая страница, в которую мне нужно отказаться от приложения angular с контроллерами, которые могут быть загружены динамически.
Вот фрагмент, в котором я догадываюсь, как это сделать на основе API и некоторых связанных с ним вопросов, которые я нашел:
// Make module Foo
angular.module('Foo', []);
// Bootstrap Foo
var injector = angular.bootstrap($('body'), ['Foo']);
// Make controller Ctrl in module Foo
angular.module('Foo').controller('Ctrl', function() { });
// Load an element that uses controller Ctrl
var ctrl = $('<div ng-controller="Ctrl">').appendTo('body');
// compile the new element
injector.invoke(function($compile, $rootScope) {
// the linker here throws the exception
$compile(ctrl)($rootScope);
});
JSFiddle. Обратите внимание, что это упрощение фактической цепочки событий, существуют различные асинхронные вызовы и пользовательские входы между строками выше.
Когда я пытаюсь запустить вышеуказанный код, компоновщик, который возвращается $compile throws: Argument 'Ctrl' is not a function, got undefined
. Если я правильно понял загрузчик, инжектор, который он возвращает, должен знать о модуле Foo
, правильно?
Если вместо этого я создаю новый инжектор с помощью angular.injector(['ng', 'Foo'])
, он, похоже, работает, но он создает новый $rootScope
, который больше не является тем же областью, что и элемент, в котором был загружен модуль Foo
.
Я использую правильные функции для этого или есть что-то, что я пропустил? Я знаю, что это не делает способ angular, но мне нужно добавить новые компоненты, которые используют angular, на старые страницы, которых нет, и я не знаю всех компонентов, которые могут понадобиться, когда я загружаю модуль.
UPDATE:
Я обновил fiddle, чтобы показать, что мне нужно добавить несколько контроллеров на страницу в неопределенные моменты времени.