什么';Angular2的ngOnInit和NgoAfterViewInit之间的区别是什么?

什么';Angular2的ngOnInit和NgoAfterViewInit之间的区别是什么?,angular,ngoninit,Angular,Ngoninit,我无法理解ngOnInit和ngAfterViewInit之间的区别 我发现它们之间的唯一区别是@ViewChild。根据以下代码,它们中的elementRef.nativeElement是相同的 我们应该使用哪个场景ngAfterViewInit @组件({ 选择器:“我的子视图”, 模板:` {{英雄}} ` }) 导出类ChildViewComponent{ @Input()英雄:字符串='Jack'; } ////////////////////// @组成部分({ 选择器:“查看后”,

我无法理解
ngOnInit
ngAfterViewInit
之间的区别

我发现它们之间的唯一区别是
@ViewChild
。根据以下代码,它们中的
elementRef.nativeElement
是相同的

我们应该使用哪个场景
ngAfterViewInit

@组件({
选择器:“我的子视图”,
模板:`
{{英雄}}
`
})
导出类ChildViewComponent{
@Input()英雄:字符串='Jack';
}
//////////////////////
@组成部分({
选择器:“查看后”,
模板:`
--子视图开始--
--子视图结束--`
+ `

{{comment}}

` }) 导出类AfterViewComponent实现AfterViewInit、OnInit{ private prevHero=“”; 公共名称='Tom'; 公众评论=“”; //查询“ChildViewComponent”类型的视图子级` @ViewChild(ChildViewComponent)ViewChild:ChildViewComponent; 构造函数(专用记录器:LoggerService,专用elementRef:elementRef){ } 恩戈尼尼特(){ console.log('OnInit'); log(this.elementRef.nativeElement.querySelector(“#我的子视图id”); log(this.elementRef.nativeElement.querySelector(“#在视图id之后”); console.log(this.viewChild); log(this.elementRef.nativeElement.querySelector('p'); } ngAfterViewInit(){ console.log('AfterViewInit'); log(this.elementRef.nativeElement.querySelector(“#我的子视图id”); log(this.elementRef.nativeElement.querySelector(“#在视图id之后”); console.log(this.viewChild); log(this.elementRef.nativeElement.querySelector('p'); } }
ngonit()
在第一次检查指令的数据绑定属性之后,在检查其任何子项之前调用。当指令被实例化时,它只被调用一次

ngAfterViewInit()
在创建组件的视图及其子视图后调用。它是一个生命周期挂钩,在组件的视图完全初始化后调用。

ngOnInit()
在第一次调用
ngochanges()
后调用<每次通过更改检测更新输入时,都会调用code>ngochanges()


ngAfterViewInit()
在视图最初呈现后调用。这就是
@ViewChild()
依赖它的原因。在呈现视图成员之前,您无法访问它们。

内容是作为子级传递的内容。视图是当前组件的模板

视图在内容之前初始化,因此在
ngAfterContentInit()之前调用
ngAfterContentInit()

**第一次检查子指令(或组件)的绑定时,将调用
ngAfterViewInit()
。因此,它非常适合使用Angular 2组件访问和操作DOM。正如前面提到的@Günter Zöchbauer是正确的
@ViewChild()
,因此它内部运行良好

例如:

@Component({
    selector: 'widget-three',
    template: `<input #input1 type="text">`
})
export class WidgetThree{
    @ViewChild('input1') input1;

    constructor(private renderer:Renderer){}

    ngAfterViewInit(){
        this.renderer.invokeElementMethod(
            this.input1.nativeElement,
            'focus',
            []
        )
    }
}
@组件({
选择器:“小部件三”,
模板:``
})
导出类WidgetThree{
@ViewChild('input1')input1;
构造函数(私有呈现器:呈现器){}
ngAfterViewInit(){
this.renderer.invokeElementMethod(
此.input1.nativeElement,
"聚焦",,
[]
)
}
}

当您说“渲染”时,是指它出现在屏幕上吗?(或发送以呈现在屏幕上)添加到DOM时。如果设置
display:hidden
,则直到渲染为止,但在屏幕上不可见。但是如果您使用浏览器开发工具研究DOM,您将能够看到标记。“在呈现视图成员之前,您无法访问它们”-那么您如何解释
ViewChild
(vc)在
onNgInit
上可用,你能解释一下吗?@Royi我无法用手机打开你的Plunker,过几天我就会回到电脑前。静态添加的元素已在
ngOnInit
中提供。如果您的内容是由
*ngFor
从数据传递到
@Input
呈现的,则此内容在
ngOnInit
中尚不可用,非常感谢您的回复。这正是情况。所以我想就是这样了。祝你假期愉快。我认为你错了。ngAfterViewInit()仅在ngAfterContentChecked()之后执行,ngAfterContentChecked()仅在ngAfterContentInit()和每个后续ngDoCheck()之后执行。有关更多详细信息,请参阅详细信息