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.

  • 相关阅读:
    VS扩展开发 二 从示例程序出发
    VS扩展开发 一 导航
    CLR笔记 二 函数调用
    使用C#调用C++类库
    C#编程常用工具总结
    CLR笔记 一 概述
    C#工程中 使用targets和props实例
    VS C++工程的静态库引用问题
    C#高级编程笔记(三)
    (转)如何让CPU的使用率一直在50%
  • 原文地址:https://www.cnblogs.com/Answer1215/p/6417976.html
Copyright © 2011-2022 走看看