2017-01-20 5 views
0

アングルでディレクティブを属性として管理する方法に問題があります。ディレクティブをアトリビュートとして使用する場合の転記

私はトランスクルージョンを使用している要素のディレクティブがあります。

<xx-button>Button!</xx-button> 

を、私はそれにいくつかの他のディレクティブを追加することにより、要素の内容を変更する指示があります。

<xx-button xx-modifying-directive>Button!</xx-button> 

この意志を

<xx-button some-other-directives> 
    <button>Button!</button> 
</xx-button> 

私がliの要素の内容をコンパイルするとxx-modifying-directiveディレクティブの機能をnking、私は次のエラーを取得する:

Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element:

あなたはこのJSFiddleでより多くの問題を明確に見ることができます。

docまたはngRepeatのソースコードを読むには、その問題を解決する方法がありません。

注:私の要素をxx-modifying-directiveにコンパイルする必要があります。この指令はコンパイルする必要がある他の指令を追加するためです(実際にはhm-panのようなハンマーハンドラを追加しています)。

更新:

がより密接に見ると、問題は(ngTranscludeディレクティブ)[https://github.com/angular/angular.js/blob/2a156c2d7ec825ff184480de9aac4b0d7fbd5275/src/ng/directive/ngTransclude.js#L59]がtransclude機能を渡されていないという事実から来ています。

なぜ実際にはtranscludeがアクティブ化されている祖先(xx-button)が存在するのかわかりません。

+0

属性ディレクティブが宣言されている(親)要素を手動でコンパイルしようとしています。これは間違っていて、実際には何も実現していません。コンパイルサービスは、動的に生成する新しいテンプレート文字列とともに使用する必要があります。サービスのドキュメントを慎重に読んでください。おそらく最も複雑で難しい角度の話題の1つです。 –

+0

私は '要素'がを表していると信じており、この要素に指示が追加されるとコンパイルする必要があります。 –

答えて

1

$transcludeの機能を$compileに提供する必要があります。それはlink関数に渡されます。

link: function(scope, elem, attrs, $transclude) { 
    [...] 
    if ($transclude) { // It can be undefined if not content is provided 
    $compile(element, $transclude)(scope); 
    } 
    [...] 
} 

移管バスに詳しく知りたい場合は、linkに従ってください。

関連する問題