2017-01-01 2 views
0

私はこのコードを持っている:

app.directive('foo', function($compile) { 
    return { 
    restrict: 'E', 
    scope: {}, 
    template: '<span>{{bar}}</span>', 
    compile: function(element, attrs) { 
     element.attr('title', '{{bar}}'); 
     return function(scope, element, attrs) { 
     scope.bar = 'hello'; 
     $compile(element)(scope); 
     } 
    } 
    } 
}); 

Plunkr: http://plnkr.co/edit/nFTgvYqoiFAthmjoizWS?p=preview

私はリンク機能に$compileビットを削除する場合は、title属性は式のテキスト({{bar}})とない値に残る('hello' );

誰でも理由を説明できますか?

これはコンパイルフェーズのためのものだと思っていました。テンプレートを操作して、スコープとデータバインディングのリンクを準備しています。手動で$compileに再度電話する必要があるのはなぜですか?テンプレートはすでにコンパイルされていませんか?

+1

'、' preLink'、 'postLink' postCompile段階はスコープにリンクする前にDOMを操作するために利用可能ですが、この時点でリンク関数は作成されていますがスコープは作成されていません。コンパイルを必要としないDOMを追加できます。ディレクティブを含む、または補間が必要な追加要素が追加された場合、ディレクティブと補間が機能するためには、これらの追加要素をコンパイルしてリンクする必要があります。 – georgeawg

+1

コンパイルする前にテンプレートを管理するには、 'template'プロパティに関数を与えてください:' template:function(tElement、tAttrs){} '詳細については、[AngularJS Comprehensive Directive API Reference - Template](https://docs.angularjs.org/api/ng/service/$compile#-template-)を参照してください。 – georgeawg

+0

@georgeawgありがとう!私はそれを自分で読むことができた参照に私を指摘できますか?私はどのようにこれについて知っていたはずだったのだろうと思っています(そしてあなたはそれについてどうお知りになりますか?) – krulik

答えて

1

はたぶん相名がcompilepreLink、およびpostCompilepostLinkpreLink、およびpostLinkから変更する必要があります。 postCompileフェーズは、スコープにリンクする前にDOMを操作するために使用可能です。この時点で、リンク機能は作成されていますが、スコープは作成されていません。コンパイルを必要としないDOMを追加できます。ディレクティブを含む、または補間が必要な追加要素が追加された場合、ディレクティブと補間が機能するためには、これらの追加要素をコンパイルしてリンクする必要があります。

コンパイルする前にテンプレートを管理するには、テンプレートプロパティに関数template: function(tElement, tAttrs) {}を指定します。詳細については、AngularJS Comprehensive Directive API Reference -- Templateを参照してください。


あなたは「などのDOMは何のコンパイルを必要としないことを追加することができ、」への参照を共有することができますあなたはこれについてどうやって見つけたのですか?

情報のいくつかのソース:たぶん相名は `postCompileに` compile`、 `preLink`、と` postLink`から変更する必要があります

+0

「コンパイルなどを必要としないDOMを追加できます」への参照を共有できますか?あなたはこれについてどうやって見つけたのですか?私はこれを正しく理解し、将来の掘り起こしを救いたいと思っています。 – krulik

関連する問題