ng-Inhalte wählen Sie variable gebunden
Ich versuche, erstellen Sie ein Formular-generator mit Winkel-2. Ein sehr einfaches Beispiel ist wie folgt:
this.fields = [{name: 'Name', type: 'text'}, {name: 'Age', type: 'number'}];
Aber ich möchte auch Unterstützung für benutzerdefinierte Elemente, wie:
this.fields = [
{name: 'Name', type: text},
{name: 'Age', type: 'custom', customid: 'Ctl1'},
{name: 'Whatever', type: 'custom', customid: 'Ctl2'}
];
//template:
<super-form [fields]="fields">
<Ctl1><input type="number" ...><Ctl1>
<Ctl2><whaterver-control ...><Ctl2>
</super-form>
In meinen Formular-generator-Komponente habe ich dann so etwas wie:
<div *ngFor="let f of fields">
<div [ngSwitch]="f.type">
<span *ngSwitchWhen="'custom'">
<ng-content select="f.customid"></ng-content>
</span>
</div>
</div>
Aber da bin ich hier offensichtlich nicht funktioniert. Ist das ein ng2 Einschränkung? Wenn dem so ist, ich denke, ich könnte hart code sagen 5 optionale content-Elemente und überprüfen Sie, ob Sie angegeben werden müssen und nicht dynamisch wählt, sondern das ist ein hack.
Cheers
Du musst angemeldet sein, um einen Kommentar abzugeben.
Seit der Bindung an eine variable, verwenden Sie bitte das one-way-binding-syntax:<ng-content [select]="f.customid"></ng-content>
Korrektur
ng-content
ist für statische Projektion nur. Es soll schnell sein "transcluding". Bitte überprüfen Sie dieses Problem für mehr infong-content
ist für statische Projektion nur. wählen Sie dieses ThemaIch weiß, das ist eine alte Frage, aber dies ist einer der ersten Orte, die ich landete bei der Suche nach dieser Funktionalität, so werde ich hinzufügen, wie ich war in der Lage, es zu lösen.
ngContent ist nur für statische Projektion, so dass Sie nicht verwenden können, es zu tun, keine Bindungen. Wenn Sie brauchen Bindungen in den projizierten Inhalten, die Sie verwenden können, ngTemplateOutlet und ngOutletContext.
Beispiel:
Innen MyComponent Sie zugreifen können, die Vorlage mit ContentChild:
Dann innerhalb der Komponente Vorlage, die Sie übergeben, ngTemplateOutlet wie diese:
Den ngOutletContext ist optional, aber es ermöglicht Ihnen, das Objekt zu erstellen, dass Sie verbindlich in der Vorlage. Beachten Sie, dass ich erstellt eine Eigenschaft
item
im Kontext-Objekt. Mit den Namen habe ich auf die Vorlage hier:let-item="item"
Nun der Verbraucher von
my-component
übergeben können, die in der Vorlage verwendet werden, die für jedes Element in der Liste.Kredit:
Diese Antwort führte mich in die richtige Richtung.
Outlet
Vorlage (der mit derlet-item
) in einer anderen Komponente? - nicht direkt immy-component
?<ng-content>
nur mit übergabe von Variablen von Kind zu Elternteil. Ich Liebe es. Mein Verständnis ist, dass man mehrere Vorlagen wie<template let-item1="..">
,<template let-item2="...">
etc.Können Sie tun dies bereits, wenn Sie wickeln Sie den Inhalt mit einem
<template>
element.Plunker Beispiel
SomeComponent
(könnte alles sein). Ich habe gerade es, zu zeigen, wie der Inhalt in der verabschiedeten Vorlage zu binden, um die Eigenschaften inSomeComponent
. Hoffe, das hilft. Wenn Sie weitere Fragen haben, werde ich nicht Antworten, heute nicht mehr. Hier ist es Zeit für das Bett. Dieprop
Zeug ist auch nur einige Beispiel, wie zu binden, die aus der Vorlage (wie vor) brauchen Sie nicht, um es für den einfachsten Fall.@NgModule({ declarations: [...]
.<template [ngTemplateOutlet]="..."
funktionieren stattTemplateWrapper