2017-12-14 4 views
2

それでは、私がやってみたかったことは、このようなテンプレートを使用して簡単な条件ラッパーコンポーネントを持つことです。角度の状態で子コンポーネントの初期化を抑制する方法はありますか?

<ng-container *ngIf="condition; else falseCondition"> 
    <ng-content *ngIf="condition"></ng-content> 
</ng-container> 
<ng-template #falseCondition> 
    <div class="div"> 
     <div class="col-xs-12"> 
      <p translate="translate" class="text-center">{{message}}</p> 
     </div> 
    </div> 
</ng-template> 

と私はこのようにそれを使用したい:someConditionがfalseの場合でも、しかし、

<myComponent [condtion]="someCondition" [message]="some message"> 
    <someOtherComponent [bindings]....></someOtherComponent> 
</myComponent> 

some messageが期待通りに表示され、someOtherComponentが初期化されます。初期化を控える方法はありますか? conditionが偽であれば、それはまったく作成されないことを望んでいました。

ラッパーコンポーネントを使用しないと(下のように)、普通の*ngIfのelseテンプレートを使用すると、期待どおりに動作します。他のコンポーネントはまったく初期化されません。

<ng-container *ngIf="someCondition"> 
     <!-- this works just fine --> 
     <someOtherComponent [bindings]....></someOtherComponent> 
    </ng-container> 
+0

は '[条件]' someOtherComponent'内部と 'myComponentというを残すを入れてみてください'空。これはDOMからあなたの 'someOtherComponent'を破壊するはずです(そして初期化を避ける)が、あなたの' myComponent'はDOM内に残ります(内部に他のものがなければ空です)。より具体的には、コントローラを@Input()の状態で使用する必要があります。 –

+0

@LucaTaccagni条件について興味深いのは何もありません。その入力だけは何もない。あなたはそこにもfalseを置くことができ、コンテンツ投影が必要な場合は、それを防ぐ方法がないので、 – Antoniossss

+0

が動作するはずです。 –

答えて

2

myComponentディレクティブはなく、独自のテンプレートを持っていなければならない要素ではないことを考えると、それはngIfディレクティブがないと同じようにコンパイルされることから、その内容を防ぐことはできません。

@Component({ 
    selector: 'myComponent', 
    template: ` 
<ng-container [ngTemplateOutlet]="template" *ngIf="condition; else falseCondition"> 
    <ng-content *ngIf="condition"></ng-content> 
</ng-container> 
... 
    `, 
}) 
class MyComponent { 
    @ContentChild(TemplateRef) template; 
    ... 
} 

そしてそれが好き使用:

これは<ng-template>としてコンポーネントのコンテンツを供給することにより解決することができる

<myComponent [condtion]="someCondition" [message]="some message"> 
    <ng-template> 
    <someOtherComponent [bindings]....></someOtherComponent> 
    </ng-template> 
</myComponent> 
+0

残念ながら@estusですが、 ''はコンポーネントHTMLレンダリングの前にラッパーとして動作するはずです。おそらく、 ''を ' 'に変更すると動作しますか? –

+1

@ルカタカンニあなたはおそらくそれらの2つを混同しました。 ng-contentはコンテンツのプレースホルダです。ラッパーとして機能するものはng-containerです。いずれにしても、someOtherComponentが少なくとも1回はコンパイルされないようにします。これは空の 'template'でもコンパイルされます。 – estus

+0

ここで何を主張しているのか分かりませんが、これは私が望むように機能します。私は、開発者にng-templateとallsinを完全にうまく包むように強制しています。内部コンポーネントは、条件が満たされた場合にのみ初期化されます。ありがとう – Antoniossss

関連する問題