2017-10-09 1 views
0

J'ai un composant qui contient l'élément form. Ce formulaire a un input[type="number"] qui sera utilisé pour ajuster un élément iframe. Le problème est, l'élément iframe est à l'intérieur @ViewChild. Comment puis-je passer le [(ng-model)] sur l'entrée de formulaire au [width] sur le iframe à l'intérieur de @ViewChild? Le code ressemble à ceci:Comment passer [(ng-model)] dans @ViewChild dans Angular4?

@Component({ 
    selector: "demo-iframe", 
    template: ` 
    <form (submit)="onSubmit($event)"> 
    <input type="number" min="0" [(ngModel)]="model.px">px 
    <button>update px</button> 
    </form> 
    <div #placeholder></div> 
    ` 
}) 

export class DemoIframeCmp { 
    @ViewChild("placeholder", { read: ViewContainerRef }) private viewContainerRef: ViewContainerRef; 


constructor (
    private route: ActivatedRoute, 
    private router: Router, 
    private compiler: Compiler 
) { 
    document.title = "Test iframe"; 
    this.paramsSub = this.route.params.subscribe((params: IClickDemoParams) => { 
     document.title = `Demo iframe ${params.demoId}`; 
     this.buildDemo(params.demoId); 
    }); 

    this.setWidth = 800; 
    } 


    private buildDemo (selector: string) { 
    @Component({ 
     selector: "test-iframe", 
     template: ` 
     <iframe class="iframe-demo" src="http://localhost:3000/${selector}" [width]="px"></iframe> 
     ` 
    }) 

} 

Répondre

0

La façon la plus simple est de créer un @input() getter et setter dans votre composant enfant:

_yourValue; 
@Input() set yourValue(val) { 
    this._yourValue = val; 
} 
get yourValue() { 
    return this._yourValue; 
} 

Cela agira comme ngModel pour les parents à l'enfant

+0

Pouvez-vous donner une démo rapide? Je l'ai essayé mais je ne pouvais pas passer la valeur :( – ivanasetiawan

+0

C'était la démo Vous pouvez passer une valeur à votre enfant en utilisant la notation html: [votreValeur] = "valeur" – Carsten

0

Je l'ai résolu en mettant le form à l'intérieur du composant enfant. En outre, au lieu d'utiliser @Directive, j'utilise le comportement de liaison de données d'Angular. Quelque chose comme ça, mais à l'intérieur de la @ViewChild

@Component({ 
    selector: 'my-app', 
    template: 
    <form #f="ngForm" (submit)="onSubmit($event)"> 
     <input type="number" [(ngModel)]="model.px" name="px">px 
     <button type="submit">adjust</button> 
    </form> 

    instant: 
    <iframe [width]="model.px"></iframe> 
    needs submit: 
    <iframe [width]="px"></iframe> 
}) 

export class App { 
    model = { 
    px: 10 
    } 

    px = 0 

    constructor() {} 

    onSubmit(event: Event) { 
    event.preventDefault() 
    this.px = this.model.px 
    } 
} 

export class AppModule {}