@Viewchild is not working inside Directive, but working in Component

Discussão em 'Angular' iniciado por Aparigraha, Novembro 20, 2024.

  1. Aparigraha

    Aparigraha Guest

    I am just playing around with @ViewChild/@ContentChild, and I was surprised to see that the @ViewChild is not working inside directive and is working fine for component.But in Directive its not working. I tried with AfterViewInit hook, so life cycle hook is not the reason. Something else is the issue here,Please find the code below.

    app.component.html

    <div appMain >
    <div #testContentDiv style="background-color: grey">
    <p>This is the first p tag</p>
    <p>This is the second p tag</p>
    </div>
    <div #testViewDiv style="background-color: yellow">
    <p>This is the first p tag</p>
    <p>This is the second p tag</p>
    </div>
    <app-test-child></app-test-child>
    </div>


    test-dir.ts --Directive

    import { Directive, ViewChild, ElementRef, OnInit, AfterViewInit, AfterContentInit, ContentChild } from '@angular/core';

    @Directive({
    selector: '[appMain]'
    })
    export class MainDirective implements OnInit, AfterContentInit, AfterViewInit {

    constructor() { }
    // tslint:disable-next-line:member-ordering
    @ContentChild('testContentDiv') testContent: ElementRef;
    @ViewChild('testViewDiv') testView: ElementRef;
    ngOnInit() {
    //Called after the constructor, initializing input properties, and the first call to ngOnChanges.
    //Add 'implements OnInit' to the class.
    // console.log(this.test.nativeElement);

    }

    ngAfterContentInit() {
    //Called after ngOnInit when the component's or directive's content has been initialized.
    //Add 'implements AfterContentInit' to the class.
    console.log('Content Div: ngAfterContentInit: ' + this.testContent.nativeElement);
    // console.log('View Div: ngAfterContentInit: ' + this.testView.nativeElement);


    }

    ngAfterViewInit() {
    //Called after ngAfterContentInit when the component's view has been initialized. Applies to components only.
    //Add 'implements AfterViewInit' to the class.
    console.log('Content Div:ngAfterViewInit: ' + this.testContent.nativeElement);
    console.log('View Div: ngAfterViewInit: ' + this.testView.nativeElement);

    }
    }


    app.component.ts

    import { Component } from '@angular/core';

    @Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.css']
    })
    export class AppComponent {
    title = "App works";

    constructor() {
    }
    }

    Continue reading...

Compartilhe esta Página