4

UI 関連 (つまり、メニューを開く状態) のグローバル変数をいくつか用意したいと考えています。$rootScopeいつでもアクセスできるように、これらを配置することにしました。

これは私が書いたコードです:

(function (angular) {

    angular
        .module("App", [])
        .run(["$rootScope", function ($rootScope) {
            angular.extend($rootScope, {
                ui: {
                    menu: false,
                    ...
                }
            });
        }]);

})(angular);

angular.extend同じオブジェクトに対する連続した操作が確実に保持されるように、意図的に を使用しました。また、オブジェクトに複数のプロパティを 1 つずつ追加するよりもクリーンで安全だと思います。

問題

ただし、上位コードは何もしません。アプリケーションを実行し、次を呼び出してルート スコープを確認すると:

$("body").scope().$root.ui

アプリケーションのディレクティブによって操作されるundefinedプロパティまで取得します。そうして初めて参照が取得されます...しかし、それはまだ関数で定義したものではなく、ディレクティブが式ごとに生成したAngularによって生成されたオブジェクトプロパティです。uing-clickuirun()ng-click

私は何を間違っていますか?

4

1 に答える 1

0

解決済み - モジュールが上書きされました

Iaはそれを自分で解決することができました。上の質問に含まれるコードは、アプリケーションの実際の問題を示すのに十分ではありません。問題は、モジュールの要件とファイルの順序をロードする方法でした。

次の順序でファイルをロードしています。

app.js
routing.js
service.something.js
...
filter.something.js
...

そこで、後続のファイルでアプリ モジュールにモジュール要件を追加することを考えました (ti を実際にモジュール化します)。これにより、実行時エラーなしで特定のファイルを簡単に含めたり除外したりできます。また、アプリケーションの実行時に追加のファイルを動的にロードすることもできます。

私のコードの問題は、後続のファイルで元のモジュールをオーバーライドしたことです。すべてのモジュール要件をapp.jsすべてに追加すると、すべてが機能し始めました。

考えられる回避策

この種の機能を望んでいるのは私だけではないことがわかります。Lasy モジュール要件の読み込みは、この Google グループの投稿に従って可能です。

それが行うことは、新しいインジェクター関数を作成することです

instanceInjector.loadNewModules = function (mods) {
    forEach(loadModules(mods), function(fn) { instanceInjector.invoke(fn || noop); });
};

これは、後で個々のモジュールで使用して、次のようにしてメイン アプリケーション モジュールに要件として追加できます。

$injector.loadNewModules(["Module1", "Module2", ...]);

代わりにこれを行うことができるように、Module型に追加の関数が呼び出された場合は、はるかに優れていますが(私の意見では) :requires()

angular.module("MainModule").requires(["AdditionalModule", "OtherModule", ...]);

そうすることで、より簡潔で使いやすく、理解しやすくなると思います。

于 2014-01-08T02:28:49.743 に答える