J'ai une page existante dans laquelle je dois déposer une application angulaire avec des contrôleurs qui peuvent être chargés dynamiquement.
Voici un extrait qui met en œuvre ma meilleure idée de la façon dont cela devrait être fait en fonction de l'API et de certaines questions connexes que j'ai trouvées :
// 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 . Notez qu'il s'agit d'une simplification de la chaîne d'événements réelle, il y a plusieurs appels asynchrones et entrées utilisateur entre les lignes ci-dessus.
Lorsque j'essaie d'exécuter le code ci-dessus, le linker qui est retourné par $compile jette : Argument 'Ctrl' is not a function, got undefined
. Si j'ai bien compris le fonctionnement de bootstrap, l'injecteur qu'il renvoie doit connaître l'existence de l'objet de l'utilisateur. Foo
module, n'est-ce pas ?
Si à la place, je crée un nouvel injecteur en utilisant angular.injector(['ng', 'Foo'])
cela semble fonctionner, mais cela crée une nouvelle $rootScope
qui n'a plus le même champ d'application que l'élément où se trouve la fonction Foo
a été amorcé.
Est-ce que j'utilise la bonne fonctionnalité pour faire cela ou y a-t-il quelque chose que j'ai manqué ? Je sais que ce n'est pas la façon de faire d'Angular, mais j'ai besoin d'ajouter de nouveaux composants qui utilisent Angular à d'anciennes pages qui ne le font pas, et je ne connais pas tous les composants qui pourraient être nécessaires lorsque je démarre le module.
UPDATE :
J'ai mis à jour le violon pour montrer que je dois être capable d'ajouter plusieurs contrôleurs à la page à des moments indéterminés.