【发布时间】:2017-01-08 11:06:33
【问题描述】:
我查看了几个相关的帖子和文档,但似乎仍然无法从 @ViewChild 获得预期的行为。
最终,我正在尝试设置 div 的滚动位置。此元素不是组件,而是我的 HTML 中的普通 div。
为此,我尝试使用@ViewChild 来获取我需要的DOM 元素,并设置它的滚动值。 (顺便说一句,如果您知道在没有 @ViewChild(或 jQuery)的情况下完成此任务的更好方法,我们将非常感谢您的回答!)
目前,@ViewChild 只返回 undefined。通过一些虚拟检查: - 我正在 AfterViewInit 中访问我的元素 - 我在这个元素上没有任何其他指令,如 *ngIf 或 *ngFor。
这是控制器:
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);
}
}
还有模板:
<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>
我的输出很简单:我的元素:未定义。
如您所见,我目前正在尝试通过 ID 访问元素,但也尝试过类名。谁能提供更多关于 ViewChild 选择器查询的详细信息?
我还看到了将哈希“#”用作@ViewChild 使用的选择器标识符的示例——但这会导致我使用#gallery-container 时出现模板解析错误。
我想不出还有什么可能是错误的。感谢所有帮助,谢谢!
此处提供完整代码:https://github.com/aconfee/KimbyArting/tree/master/client/KimbyArting/components/portfolio-page
【问题讨论】:
-
你试过使用属性绑定吗?我不知道你想要哪个滚动属性,但你可以试试:
<div [someScrollProperty]="someComponentProperty" ...>。然后只需在您的组件逻辑中更新this.someComponentProperty。另请参阅stackoverflow.com/a/36224837/215945。 -
感谢您添加此内容!实际上,我一直在研究这个作为解决我最初问题的一种方式——设置滚动值。我已经制作了一个自定义指令并将其传递给所需的滚动值。我还希望该指令监视父组件何时使用 ngOnChanges 更改此值。 ngOnChanges 是在组件和指令之间绑定属性的最佳方式吗?我注意到您发送的示例的做事方式有所不同..您能否详细说明或发送有关他们正在做什么的文档?我没有意识到组件有一个指令数组。那里存在什么默认绑定?
-
ngOnChanges 是一个好方法。我发送的示例只是向您展示一个实际的绑定示例(在这种情况下使用
[inScrollHeight])。不要担心该帖子中的内容投影和“检查后已更改”错误。组件与其在directives数组中指定的指令之间没有默认绑定。您必须在 HTML 模板中声明所需的任何绑定。 -
明白了,谢谢。我仔细阅读了它,事情变得更有意义了。
标签: dom angular scroll viewchild