2017-02-23 2 views
2

Ich habe Schwierigkeiten, Kontextdaten an meine dynamisch erstellte eingebettete Ansicht zu übergeben.Angular - Festlegen des Kontexts mit createEmbeddedView

Hinweis: I Angular 2.4.7

Hier bin mit ist, was ich whant zu erreichen:


In meinem DialogPresetComponent(Dialog-Preset. Komponente.html):

Diese Ansicht der Komponente enthalten bereit eine Reihe von Vorlage in meinem Dialog Framework verwendet werden:

<template #presetInfo> 
    {{options.description}} // Note this binding ! Here is the problem 
</template> 

Noch in dieser Komponente, erhalte ich eine ref zu diesen Vorlagen wie folgt aus:

@ViewChild('presetInfo', { read: TemplateRef }) presetInfo: TemplateRef<any>; 

Dann i speichern Diese templateRef in einem DialogService, damit ich später und von woanders auf sie zugreifen kann.


In DialogComponent(dialog.component.html):

<div class='c-header'> 
</div> 
<div class='c-body'> 
    <div #container></div> 
</div> 
<div class='c-footer'> 
</div> 

In DialogComponent(Dialog:

Hier wird die Vorlage meiner modal component.ts):

In meinem DialogComponent schnappen Sie sich einen Hinweis auf den Behälter wie folgt aus:

options: DialogOptions = { title: 'Dialog title' }; 

:

@ViewChild('container', {read: ViewContainerRef }) containerRef: ViewContainerRef; 

ich auch Attribute definieren, die ich von meiner dynamicly Vorlage zugreifen möchten injiziert

Was versuche ich zu tun:

Ich versuche, die Vorlage #presetInfo im #container und mit Rahmen meines DialogComponent

So finaly zu setzen, ich spritze meine Vorlage in meiner Komponente ihm das Recht gibt, Kontext:

In meinem DialogComponent(dialog.component.ts):

// Where templateRef is the template previously defined in DialogPresetComponent 
createEmbeddedView(templateRef: TemplateRef<any>) { 
    this.containerRef.createEmbeddedView(templateRef, this);  
} 

Das Problem aus der Tatsache, dass die Bindung {{}} options.description in meiner injizierten Vorlage nicht funktionieren, selbst wenn das Bestehen der richtigen Kontext ('this' in meinem Fall) über createEmbeddedView.

Das Framework sagen mir, dass Optionen nicht definiert ist.

Was fehlt mir hier?

Es gibt nicht viel Dokumentation über diese Dinge ‚Kontext‘, so dass ich denke, ich nicht, dass es der richtige Weg mache ....

Irgendwelche Anhaltspunkte oder Hinweise sind willkommen!

Danke!

+0

Scheint du passierst 'this' als Kontext. Ist das beabsichtigt? –

+1

Ja, das ist beabsichtigt, ich denke, dass das Übergeben von 'dies' alle meine Komponenten-Mitglieder innerhalb der mitgelieferten Vorlage verfügbar machen würde. Wie wenn meine Vorlage Teil der Komponentenansicht wäre ... – Clement

Antwort

5
this.containerRef.createEmbeddedView(templateRef, {$implicit: {description: 'some description'} });  
<template #presetInfo let-options> 
    {{options.description}} // Note this binding ! Here is the problem 
</template> 

Wenn Sie ein Objekt mit einer Eigenschaft übergeben $implicit dann nur let-xxx genügt, um den $implicit Wert als xxx in der Vorlage zu machen.

Für andere Eigenschaften benötigen Sie let-yyy="someProp", um es in der Vorlage als yyy verfügbar zu machen.

+0

Verdammt, die Arbeit! Vielen Dank, wo haben Sie die Dokumentation zu diesem $ impliziten Attribut und den Regeln, die Sie erklären? Aus dem eckigen Quellcode? – Clement

+0

Ich sah es in Diskussionen in Angular2 GitHub Probleme oder Pull Requests. Ich erinnere mich nicht genau, aber ich habe die Entwicklung von Angular2 ziemlich genau verfolgt. –

+0

Nice one! Danke – Clement

Verwandte Themen