12

通常、私は次のことを行いng-app、HTML にがあります。

var myApp = angular.module("myApp", []);

myApp.controller("AttributeCtrl", function ($scope) {
    $scope.master = {
        name: "some name"
    };
});

ただし、角度を手動でブートストラップする必要があるのは、jQuery の$.load(). 私が次のことをした場合:

main.js - これは、角度を使用したいページが取り込まれている場所です

$("#form").load(contextPath + url, params, function() {
    angular.bootstrap($("#angularApp"));
});

そして、取り込まれるページには独自の JavaScript があります。

function AttributeCtrl($scope) {
  $scope.master = { name: "some name"};
}

これは機能しますが、理想的には、コントローラーをモジュール レベルでスコープしたいと考えています。だから私はそのように上記のコードを変更しました

main.js

$("#form").load(contextPath + url, params, function() {
    angular.bootstrap($("#angularApp", ["myApp"]));
});

その後...

var app = angular.module("myApp"); // retrieve a module

app.controller("AttributeCtrl", function($scope) {
  $scope.master = { name: "some name"};
});

ただし、この方法でモジュールを取得してもうまくいかないようです。私は何か間違ったことをしていますか?

4

4 に答える 4

3

アプリをブートストラップした後は、コントローラーを作成できません。のドキュメントをangular.bootstrap参照してください。

モジュールをロードまたは定義した後、 angular.bootstrap() を呼び出す必要があります。アプリケーションのブートストラップ後に、コントローラー、サービス、ディレクティブなどを追加することはできません。

于 2015-07-14T00:04:03.767 に答える
0

これがバグなのか実装上の決定なのかはわかりません (一見貧弱に見えますが)。空の配列を追加すると、発生していた未定義のrequire問題が解決され、問題全体が解決されるはずです。

var app = angular.module("myApp", []); // create a module

app.controller("AttributeCtrl", function($scope) {
   $scope.master = { name: "some name"};
});`

また、あなたのフィドル{{name}}では、レンダリングされないものを呼び出します。あなたは電話しているはずです{{master.name}}


編集

反対票をありがとう..これが実際の例です。幸運を!

http://plnkr.co/edit/UowJpWYc1UDryLLlC3Be?p=preview

于 2013-08-22T01:27:17.970 に答える
0

更新しました

彼らはドキュメントを更新し、現在は次のようになっています

配列内の各項目は、実行ブロックとしてインジェクターによって呼び出される事前定義されたモジュールまたは (DI 注釈付き) 関数の名前である必要があります。参照: {@link angular.module モジュール}


バグのようです。

モジュールを取得するために実装した方法は正しいです。よく知られていない可能性があるため、明確にするためにドキュメントから引用してください。

2 つ以上の引数を渡すと、新しいモジュールが作成されます。引数が 1 つだけ渡された場合、既存のモジュール (モジュールの最初の引数として渡された名前) が取得されます。

あなたが言及した問題については、簡単に言えば...

bootstrap関数はcreateInjectorモジュール リストを呼び出します (最後のリスト['ng', ['ngLocale', function(){...}] , 'myApp']は、渡したモジュールです)

function bootstrap(element, modules) {
    ...
    var injector = createInjector(modules);

内部では、渡された各モジュールをcreateInjector()呼び出しますloadModules

function createInjector(modulesToLoad) {
    forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop); });

そして、オブジェクトを作成するとして初期化される をloadModules呼び出します。angularModuleangularModule = setupModuleLoader(window);window.angular.module

function loadModules(modulesToLoad){
    ....
    var moduleFn = angularModule(module); // triggers the error

angularModule2番目のパラメータを として取るため、エラーが発生しますrequires。これがないと、この行 (1148 行目) で例外がスローされます。throw Error('No module: ' + name);

報告: https://github.com/angular/angular.js/issues/3692

于 2013-08-21T21:21:54.293 に答える