I've looked at several related posts and documentation, but still can't seem to get expected behavior from @ViewChild.
Ultimately, I'm trying to set the scroll position of a div. This element isn't a component, but a normal div in my HTML.
To accomplish this, I'm trying to use @ViewChild to get the DOM element I need, and set its scroll value. (As an aside, if you know a better way to accomplish this without @ViewChild (or jQuery), answers will be very much appreciated!)
At the moment, @ViewChild only returns undefined. Going through some dummy checks: - I am accessing my element in AfterViewInit - I do not have any other directives like *ngIf or *ngFor on this element.
Here's the controller:
import { Component, AfterViewInit, ViewChild, ElementRef } from '@angular/core';
@Component({
selector: 'portfolio-page',
templateUrl: './portfolio-page.component.html',
styleUrls: ['./portfolio-page.component.scss']
})
export class PortfolioPageComponent implements AfterViewInit{
@ViewChild('gallery-container') galleryContainer: ElementRef;
ngAfterViewInit(){
console.log('My element: ' + this.galleryContainer);
}
}
And the template:
<div id='gallery-container' class='gallery-image-container'>
<div class='gallery-padding'></div>
<img class='gallery-image' src='{{ coverPhotoVm }}' />
<img class='gallery-image' src='{{ imagepath }}' *ngFor='let imagepath of imagesVm' />
</div>
My output is simple: My element: undefined.
As you can see, I'm currently trying to access the element by ID, but have tried class name as well. Could anyone provide more detail about what the ViewChild selector query is expecting?
I've also seen examples where a hash '#' is used as the selector idendifier that @ViewChild uses -- -- but this causes a template parse error for me with #gallery-container.
I can't think of anything else that could possible be wrong here. All help is appreciated, thanks!
Full code available here: https://github.com/aconfee/KimbyArting/tree/master/client/KimbyArting/components/portfolio-page
<div [someScrollProperty]="someComponentProperty" ...>
. Then just updatethis.someComponentProperty
in your component logic. See also stackoverflow.com/a/36224837/215945. – Mark Rajcok[inScrollHeight]
in that case). Don't worry about the content projection and "has changed after it was checked" error in that post. There is no default binding between a component and the directives it specifies in thedirectives
array. You have to declare any bindings you want in the HTML template. – Mark Rajcok