0

同じコントローラーを使用する 2 つの別々のページがあります。
ページ間で変更するためにUIルーターの状態を使用しています。
これらには、テンプレートに templateUrl を順番に使用する次のディレクティブが含まれて

ます

ページ B
指令
_1 指令_3 指令_4
指令
_2

各ディレクティブには、その親スコープ $scope.array に双方向でバインドされた配列 $scope.array があり、それぞれがそのディレクティブ番号をその配列に追加します。

各ディレクティブもコンソール ログに「Here:」 + ディレクティブ番号を記録します。

共通コントローラーで $scope.array を監視し、内部の何かが変更されたときに $scope.array を出力する監視関数を設定しました。

ページ A に移動すると、コンソールに次のように表示されます
: 1
[1]
ここ: 2
[1,2]

移動してからページ A に移動すると、コンソールに表示されます
ここ: 1
ここ: 2
[1,2]

したがって、watch 関数は 1 回だけ起動します。

次に、奇妙なことが起こります。ページ B に到達すると、コンソールに表示されます
ここ: 1
ここ: 2
[1,2]
ここ: 3
[1,2,3]
ここ: 4
[1,2,3,4 ]

したがって、ディレクティブは順番にロードされていないようです! 直観的に、最終的な順序は、ディレクティブがページにどのように配置されているかのように、1、3、4、2 になります。

Angular はテンプレート間でスマートな比較を行い、いくつかのディレクティブが既に読み込まれていると判断し、新しいディレクティブを試す前にそれらを即座に実行していますか?

2 回目にページ B に戻ると、通常どおり読み込まれます。何が起こっている?

4

1 に答える 1

1

私はこれがなぜなのか知っていると思います。
angular $templateCache はそのままキャッシングされるため、最初の 2 つのディレクティブはページ A の読み込み後にキャッシュされます。

ページ B に移動すると、キャッシュされたテンプレートがはるかに速く読み込まれるため、1 と 2 はすぐに読み込まれ、3 と 4 は読み込まれて $templateCache に入れられます。

次にページ B に移動すると、すべてが $templateCache にあり、再び順番に読み込まれます。

本番環境では、最初にすべてをテンプレート キャッシュに入れるので、これは問題になりません。
そうしないと、ディレクティブの順序を気にする場合、非常に注意が必要です。

于 2014-08-16T07:35:18.880 に答える