1

要素を ($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 サービスと同じことをするだけですか? それとも、パフォーマンスに違いをもたらすテンプレートの自然なコンパイルに根本的な違いはありますか?

4

1 に答える 1

1

Angular 自体が$compileディレクティブ テンプレートをコンパイルするために使用するため、手動でコンパイルする場合に固有の速度低下はありません。

ただし、重要な役割を果たすのは、いつ、どのくらいの頻度でコンパイルするかです

Angular はディレクティブ インスタンスごとに 1 回コンパイルし、必要な回数だけリンクします。
一方、リンクごとに追加のコンパイル+リンクを作成します。それは多くのオーバーヘッドです。

動的 HTML がどの程度動的であるかは明確ではありませんが、セッションの存続期間中同じままである場合は、はるかに効率的なコンパイル方法があります。

于 2014-06-03T05:25:28.360 に答える