zoukankan      html  css  js  c++  java
  • [Angular] @ViewChildren and QueryLists (ngAfterViewInit)

    When you use @ViewChildren, the value can only be accessable inside ngAfterViewInit lifecycle. This is somehow different from @ViewChild, which value can be accessed from ngAfterContentInit lifecycle.

    import { Component, ChangeDetectorRef, Output, ViewChildren, AfterViewInit, EventEmitter, ContentChildren, QueryList, AfterContentInit } from '@angular/core';
    
    import { AuthRememberComponent } from './auth-remember.component';
    import { AuthMessageComponent } from './auth-message.component';
    
    import { User } from './auth-form.interface';
    
    @Component({
      selector: 'auth-form',
      template: `
        <div>
          <form (ngSubmit)="onSubmit(form.value)" #form="ngForm">
            <ng-content select="h3"></ng-content>
            <label>
              Email address
              <input type="email" name="email" ngModel>
            </label>
            <label>
              Password
              <input type="password" name="password" ngModel>
            </label>
            <ng-content select="auth-remember"></ng-content>
            <auth-message 
              [style.display]="(showMessage ? 'inherit' : 'none')">
            </auth-message>
            <auth-message 
              [style.display]="(showMessage ? 'inherit' : 'none')">
            </auth-message>
            <auth-message 
              [style.display]="(showMessage ? 'inherit' : 'none')">
            </auth-message>
            <ng-content select="button"></ng-content>
          </form>
        </div>
      `
    })
    export class AuthFormComponent implements AfterContentInit, AfterViewInit {
    
      showMessage: boolean;
    
      @ViewChildren(AuthMessageComponent) message: QueryList<AuthMessageComponent>;
    
      @ContentChildren(AuthRememberComponent) remember: QueryList<AuthRememberComponent>;
    
      @Output() submitted: EventEmitter<User> = new EventEmitter<User>();
    
      constructor(private cd: ChangeDetectorRef) {}
    
      ngAfterViewInit() {
        console.log("this.message:", this.message); // QueryList {...}
        if (this.message) {
          this.message.forEach((message) => {
            message.days = 30;
          });
          this.cd.detectChanges();
        }
      }
    
      ngAfterContentInit() {
        console.log("this.message:", this.message); // undefined
        if (this.remember) {
          this.remember.forEach((item) => {
            item.checked.subscribe((checked: boolean) => this.showMessage = checked);
          });
        }
      }
    
      onSubmit(value: User) {
        this.submitted.emit(value);
      }
    
    }

    Here we try to modify the value inside ngAfterViewInit lifecycle. but in developement mode, there is change detection error! We cannot modify the 'messages.day' after view init. 

    We can bypass this problem by using 'ChangeDetectRef'.

    this.cd.detectChanges();

    To tell Angular change detection everything is fine. And this error won't show up in production mode, only in development mode.

  • 相关阅读:
    win10快速搭建git服务
    java字节流转对象,应用于协议解析
    产品设计-后台管理权限设计RBAC
    Git :fatal: 错误提示解决办法
    初学git,出现错误:fatal: Not a git repository (or any of the parent directories): .git
    css 清除浮动
    asp.net连接SQL SERVER 2012的方法
    c#的序列化与反序列化
    .NET三层架构例子超链接可以点击显示内容页面
    ASP.NET中iframe框架点击左边页面链接,右边显示链接页面内容
  • 原文地址:https://www.cnblogs.com/Answer1215/p/6417976.html
Copyright © 2011-2022 走看看