2013-08-28 5 views
8

(1)私はその内容を取り、いくつかの定型的なコードでそれをラップしportlet呼ばtranscludingディレクティブを持っています。例えば:AngularJS:複数のディレクティブを継承する方法は?

<div class="portlet"> 
    <div class="icon"></div> 
    <div class="content" ng-transclude="">   
    </div> 
</div> 

そして、次のようになります:

<portlet> 
    <div class="foobar">My content</div> 
</portlet> 

あるportletのテンプレート、経由する

<div class="portlet"> 
    <div class="icon"></div> 
    <div class="content"> 
     <div class="foobar">My content</div> <!--the original content 
             passed to portlet--> 
    </div> 

(2)私は2つの以上のディレクティブ、dyn-formdyn-form-fieldを持っています。このように説明:

<dyn-form> 
    <dyn-form-field type="textbox" placeholder="..." label="Name" /> 
    <! ...and so on... --> 
</dyn> 

dyn-formのテンプレート:

<form class="..." ng-transclude=""> 
</form> 

dyn-fieldのテンプレートは、それのためのラベル/フィールドを生成するためのHTMLを生成します。だから、元のコードは、このような何かに翻訳されています

<form class="..."> 
    <label>Name: <input type="text" placeholder="..." /></label> 
    <!- ....and so on... --> 
</form> 

(3)ここに問題があります。私は3番目の指示文dyn-form-portletを使用して、すべてのフォームの上に表示されているボタンを表示し、ポートレットを表示し、ポートレット内にdyn-formを入れる定型コードを生成したいとします。これは私がこれをやろうとしている方法です:

<dyn-form-portlet> 
    <dyn-form> 
    <dyn-form-field /> 
    </dyn-form> 
</dyn-form-portlet> 

dyn-form-portletのテンプレートは次のようになります。

<div class="dyn-form-portlet"> 
    <button>Foo</button> 
    <button>Bar</button> 
    <portlet ng-transclude=""> 
    </portlet> 
</div>  

Theoraticallyこれは<dyn-form><dyn-form><portlet><dyn-form-field>の内側に配置されなければならない、すなわち、動作するはずです、 等々。私はこれを実行したときしかし、私はdyn-form-portletによって表示されるボタンやportletためのコードを参照してください、しかしportletは空で、フォームがそれに表示されていません。

私は何か間違っているのですか、これはバグですか?

+1

関心のある人がいる場合にはplunkを作った:http://plnkr.co/edit/FUYCQbw8Tnx3Qhcj4108?p=previewポートレットからtrueを削除すると、それは機能しますが、意味は分かりません。 –

+1

私はそれが起こっていると私は信じています。 'dyn-form-portlet'テンプレート内の' 'ディレクティブは、ディレクティブがリンクされる前にAngularでコンパイルされていますので、' dyn-form-portlet'が処理されるとテンプレート内の 'portlet'タグが既にレンダリングされています。この[Plunker](http://plnkr.co/edit/szuDxjGPB8id2yrto7zM?p=preview)を見て、コンソールの出力を確認してください。このような場合、これがバグか角度的な自然な振る舞いであるかどうかは分かりません。 –

+0

@MichaelBenfordそれは本当に起こっているようだが、バグのようだ。つまり、 'dyn-form'の中のすべてのサブディレクティブは' dyn-form'に継承されています。なぜ 'dyn-form-portlet'と' dyn-form'の違いが違いますか?誰もAngularJSチームのバグとしてこれを報告できますか? –

答えて

5

私はそれを修正することができました。私はportletディレクティブにreplace : trueとともにtransclude : 'element'を使用し、私は他のディレクティブよりpriority高いそれを与えてくれました。私がそれをした理由は、むしろ内部の醜い働きの深い知識よりも感じています。低い優先度で定義された任意のディレクティブを含む素子全体をtransclude -

「要素は」ので、最初の部分 transclude : 'element'について

が使用されます。

私が見たことは、transcludeが要素に設定されているときに常に使用されるため、置換が使用されます。 優先順位は私の感情でした。

はここplnkr http://plnkr.co/edit/axQ90dHOLmLNeNQ4ZlNl?p=preview

これはおそらく、あなたが探していた答えではありませんが、私は本当に何が起こっているか理解するために、角の指令に深く調べる必要があります。とにかく、バグではなく、貧弱なドキュメントです。