私はこのコードを持っている:
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
に再度電話する必要があるのはなぜですか?テンプレートはすでにコンパイルされていませんか?
'、' preLink'、 'postLink' postCompile段階はスコープにリンクする前にDOMを操作するために利用可能ですが、この時点でリンク関数は作成されていますがスコープは作成されていません。コンパイルを必要としないDOMを追加できます。ディレクティブを含む、または補間が必要な追加要素が追加された場合、ディレクティブと補間が機能するためには、これらの追加要素をコンパイルしてリンクする必要があります。 – georgeawg
コンパイルする前にテンプレートを管理するには、 'template'プロパティに関数を与えてください:' template:function(tElement、tAttrs){} '詳細については、[AngularJS Comprehensive Directive API Reference - Template](https://docs.angularjs.org/api/ng/service/$compile#-template-)を参照してください。 – georgeawg
@georgeawgありがとう!私はそれを自分で読むことができた参照に私を指摘できますか?私はどのようにこれについて知っていたはずだったのだろうと思っています(そしてあなたはそれについてどうお知りになりますか?) – krulik