要素を ($compile サービスを介して) 頻繁に手動でコンパイルする必要はないということは、かなり一般的に受け入れられているようです。いくつかの動的に駆動される html のために、リンク関数で手動コンパイルを行うディレクティブがあります。このようなもの (動的 html の実際の取得は、はるかに複雑です):
link: function(scope, element, attrs) {
element.append(someService.getDynamicHtml());
$compile(element.contents())(scope);
}
このディレクティブを数回発行するページがあり、各コンパイルに 300 ミリ秒程度かかるため、いくつかのパフォーマンスの問題が発生し始めています。
「ボンネットの下」で何が起こっているのかをよりよく理解し、より良い設計上の決定を下すために、私の質問は、リンク機能を提供するのではなく、リンク機能の真ん中でこの種の手動コンパイルを行うことの違いは何ですか?テンプレートを使用してディレクティブを作成し、角度を自然にコンパイルさせますか?
これは、私が話している2つのシナリオを示すフィドルです: http://jsfiddle.net/KNLea/
動的 html 生成をリファクタリングして、文字列を作成し、それをテンプレートとして使用できるようにできると思います。上記は次のように変更されます。
template: someService.getDynamicHtml(),
link: function(scope, element, attrs) {
//no need for manual compile anymore
}
この 2 つにどのような根本的な違いがあるのか、また、期待できるパフォーマンスの向上があるとすれば、それを理解したいだけです。まったく違いはありませんか?angular がテンプレートをコンパイルするとき、$compile サービスと同じことをするだけですか? それとも、パフォーマンスに違いをもたらすテンプレートの自然なコンパイルに根本的な違いはありますか?