動的にロードできるコントローラーを備えた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 によって返されるリンカーがスローします: Argument 'Ctrl' is not a function, got undefined
. Foo
ブートストラップを正しく理解していれば、それが返すインジェクターはモジュールについて知っているはずですよね?
代わりに を使用して新しいインジェクターを作成すると、機能しているように見えますが、モジュールがブートストラップされた要素と同じスコープではない新しいインジェクターangular.injector(['ng', 'Foo'])
が作成されます。$rootScope
Foo
これを行うために適切な機能を使用していますか、それとも見逃しているものがありますか? これがAngularのやり方ではないことはわかっていますが、Angularを使用しない古いページにAngularを使用する新しいコンポーネントを追加する必要があり、モジュールをブートストラップするときに必要になる可能性のあるすべてのコンポーネントを知りません.
アップデート:
不確定な時点で複数のコントローラーをページに追加できるようにする必要があることを示すために、フィドルを更新しました。