@ContentChild normally works with ngAfterContentInit lifecycle.

@ContentChild is used for looking into child component's props.

For example, we a app component:

      <auth-form
(submitted)="loginUser($event)">
<h3>Login</h3>
<auth-remember
(checked)="rememberUser($event)">
</auth-remember>
<button type="submit">
Login
</button>
</auth-form>

Inside it define a 'auth-form' component, and for auth-form component it has 'h3', 'auth-remember' and 'button' component as children.

Auth-form:

    <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>
<ng-content select="button"></ng-content>
</form>
</div>

Inside auth-form, it use <ng-content> (content projection) to show 'h3, button & auth-remember' component. So what we want to do here is "inside auth-form component, listen to auth-remember's checked event, using its value to toggle a message div".

Add a message div:

    <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>
<div *ngIf="showMessage">You account will be kept for 30 days</div>
<ng-content select="button"></ng-content>
</form>
</div>

Using @ContentChild to get the component object.

import { Component, Output, EventEmitter, AfterContentInit, ContentChild } from '@angular/core';

import { User } from './auth-form.interface';
import {AuthRememberComponent} from './auth-remember.component'; @Component({
selector: 'auth-form',
template: `
...
`
})
export class AuthFormComponent implements AfterContentInit{
showMessage: boolean; @ContentChild(AuthRememberComponent) remember: AuthRememberComponent; @Output() submitted: EventEmitter<User> = new EventEmitter<User>(); onSubmit(value: User) {
this.submitted.emit(value);
} ngAfterContentInit(): void {
if(this.remember) {
this.remember.checked.subscribe((checked: boolean) => {
this.showMessage = checked;
})
}
} }

If we check 'this.remember':

We can subscribe 'this.remember.checked' to get whether 'auth-remember' is checeked or not, and assign the value to 'showMessage' var.

@ContentChild is really powerful, it can get any props on the child component.

For exmaple, we can add an @Input value and a private prop on to the auth-remember component.

import { Component, Output, EventEmitter, Input } from '@angular/core';

@Component({
selector: 'auth-remember',
template: `
<label>
<input type="checkbox" (change)="onChecked($event.target.checked)">
Keep me logged in
</label>
`
})
export class AuthRememberComponent { @Output() checked: EventEmitter<boolean> = new EventEmitter<boolean>();
@Input() role: string; myName: string = "Auth-remember"; onChecked(value: boolean) {
this.checked.emit(value);
}
}

And from the console log, we can see, we get everthing about the auth-remember component.

最新文章

  1. mysql 添加索引 mysql 创建索引
  2. 机器学习---python环境搭建
  3. Spring.Net 配置文件
  4. 开启mysql sql追踪
  5. ORM框架:EF与NHibernate了解
  6. [设计模式] 23 访问者模式 visitor Pattern
  7. android错误 Android NAND: nand_dev_load_disk_state,
  8. LeetCode: Binary Tree Traversal
  9. GDI+入门——带你走进Windows图形的世界
  10. java--线程状态
  11. MFC模态和非模态对话框编程
  12. Odoo POS会员积分当钱用如何设置?
  13. 当linux报 “-bash: fork: 无法分配内存”
  14. Flask实战-留言板-使用Bootstrap-Flask简化页面编写
  15. FIN vs RST in TCP connections different
  16. django models返回数据根据某字段倒序排列
  17. 学习ES6的全部特性
  18. spring-bean 版本的问题(报错:org.xml.sax.SAXParseException; lineNumber: 14; columnNumber: 75;)
  19. loglevel-metamask
  20. weblogic服务目录迁移记录

热门文章

  1. domino web app
  2. amazeui学习笔记一(开始使用3)--兼容性列表compatibility
  3. 解决Cookie乱码
  4. Oracle 12C R2 on Linux 7.X Data Guard 搭建文档
  5. 原生js大总结六
  6. maven插件介绍之tomcat7-maven-plugin
  7. js进阶 14-3 如何接收load函数从后台接收到的返回数据
  8. Android 一个异步SocketHelper
  9. Maven使用yuicompressor-maven-plugin打包压缩css、js文件
  10. js的继承操作案例