For example you have a component, which take a trasclude input element:

            <au-fa-input id="password-field" icon="lock" >
<input placeholder="Password" class="test-class">
</au-fa-input>

There is many ways to get ElementRef of the input, for example using Reference:

            <au-fa-input id="password-field" icon="lock" >
<input #input placeholder="Password" class="test-class">
</au-fa-input>

We add a #input ref, so that inside component, we can using @ContentChild and AfterContentInit lifecycle:

export class AuFaInputComponent implements AfterContentInit{

    @Input()
icon: string; @ContentChild('input')
input: HTMLInputElement; ngAfterContentInit () {
console.log("input", this.input);
}

This approach works fine, but it requires us to put a element ref onto the input field.

One way to avoid putting a reference is creating a directive ref, and we can add common functionalitiy to it, such as focus and blur events:

import {Directive, HostListener} from '@angular/core';

@Directive({
selector: 'au-fa-input input'
})
export class InputRefDirective { focus = false; @HostListener('focus')
isFocus() {
console.log("now focus");
this.focus = true;
} @HostListener('blur')
isBlur() {
console.log("now blur");
this.focus = false;
}
}

And we our component, we need to change @ContentChild:

    @ContentChild(InputRefDirective)
input: InputRefDirective;

So for now, in html, we don't need #input any more:

            <au-fa-input id="password-field" icon="lock" >
<input placeholder="Password" class="test-class">
</au-fa-input>

Now, let's say if we want to add some styling base on whether input field is focused or not.

First, some css class:

// component

:host(.input-focus) {
border-color: #4D90FE;
-webkit-box-shadow: 0 0 5px #4D90FE;
box-shadow: 0 0 5px #4D90FE;
}

Use the function form to apply host styles conditionally by including another selector inside parentheses after :host. So here, we check if .input-focus is present on the host element, then we apply the styling, otherwise not.

Now we only need to apply .input-focus class to the host element when input.focus is true, we can do this easily by @HostBinding:

  @HostBinding('class.input-focus')
get isInputFocus() {
return this.input ? this.input.focus : false;
}

------

component:

import {Component, Input, ContentChild, AfterContentInit, HostBinding} from '@angular/core';
import {InputRefDirective} from 'app/lib/common/input-ref.directive'; @Component({
selector: 'au-fa-input',
templateUrl: './au-fa-input.component.html',
styleUrls: ['./au-fa-input.component.css']
})
export class AuFaInputComponent implements AfterContentInit { @Input()
icon: string; @ContentChild(InputRefDirective)
input: InputRefDirective; @HostBinding('class.input-focus')
get isInputFocus() {
return this.input ? this.input.focus : false;
} ngAfterContentInit() {
if (!this.input) {
console.error('You forgot pass in the input field');
}
} get classes() { const cssClasses = {}; if (this.icon) {
cssClasses['fa-' + this.icon] = true;
} return cssClasses;
} }

Directive:

import {Directive, HostListener} from '@angular/core';

@Directive({
selector: 'au-fa-input input'
})
export class InputRefDirective { focus = false; @HostListener('focus')
isFocus() {
this.focus = true;
} @HostListener('blur')
isBlur() {
this.focus = false;
}
}

[Angular] @ContentChild with Directive ref的更多相关文章

  1. angular Creating a Directive that Adds Event Listeners

    <span my-draggable>Drag ME</span> angular.module('dragModule', []) .directive('myDraggab ...

  2. Angular 下的 directive (part 2)

    ngCloak ngCloak指令被使用在,阻止angular模板从浏览器加载的时候出现闪烁的时候.使用它可以避免闪烁问题的出现.   该指令可以应用于<body>元素,但首选使用多个ng ...

  3. angular 自定义指令 directive transclude 理解

    项目中断断续续的用了下angular,也没狠下心 认真的学习.angular 特别是自定义指令这块 空白. transclude 定义是否将当前元素的内容转移到模板中.看解释有点抽象. 看解释有点抽象 ...

  4. Angular自定义指令directive:scope属性

    在AngularJS中,除了内置指令如ng-click等,我们还可以自定义指令.自定义指令,是为了扩展DOM元素的功能.代码中,通过指定directive中的restrict属性,来决定这个指令是作为 ...

  5. Angular之指令Directive系列

    项目筹备近期开启Angular学习,指令比较难理解所以记录备案,推荐Angualr实战学习视频大漠穷秋 Angular实战 一.指令directive概述 指令可以对元素绑定事件监听或者改变DOM结构 ...

  6. angular插件制作——Directive指令使用详解

    1.replace——最简单的使用方法,直接将自定义标签替换为模板内的内容:  html: <!DOCTYPE html> <html> <head> <me ...

  7. Angular 下的 directive (part 1)

    directive  指令 Directive components  指令部分   使用指令自动引导一个AngularJS应用.ngApp指令指定应用程序的根元素,通常是放在页面的根元素如: < ...

  8. Angular ContentChild

    contentchild // 使用方法 git clone https://git.oschina.net/mumu-osc/learn-component.git cd learn-compone ...

  9. angular之自定义 directive

    1,指令的创建至少需要一个带有@Directive装饰器修饰的控制器类.@Directive装饰器指定了一个选择器名称,用于指出与此指令相关联的属性的名字. 2,创建一个highlight.direc ...

随机推荐

  1. VMwarep挂载镜像及配置本地Yum源

    1.挂载镜像: *. 通过mount命令         linux mount挂载设备(u盘,光盘,iso等 )使用说明 *.  通过VMware的控制页面手工挂载 1.1    打开Vmware软 ...

  2. fsck---于检查并且试图修复文件系统中的错误

    fsck命令被用于检查并且试图修复文件系统中的错误.当文件系统发生错误四化,可用fsck指令尝试加以修复. -a:自动修复文件系统,不询问任何问题: -A:依照/etc/fstab配置文件的内容,检查 ...

  3. [51Nod]NOIP2018提高组省一冲奖班模测训练(一)题解

    http://www.51nod.com/contest/problemList.html#!contestId=72&randomCode=147206 原题水题大赛.. A.珂朵莉的旅行 ...

  4. holder.js如何使用

    holder.js的使用 一.总结 一句话总结:使用:holder.js后面接图片宽高 <img src="holder.js/300x200" /> 1.holder ...

  5. web存储方法,现成代码

    1.cookie的设置与取用 function setCookie(cname,cvalue,exdays){ var d = new Date(); d.setTime(d.getTime()+(e ...

  6. C#之使用app.config可记录数据,下次打开可读取记录的数据

    一.背景 如下图所示,我通过open..按键打开了某个文件,之后我再把app给关闭掉,当再次打开app的时候,在textBox.Text上显示上一次打开的文件路径.通过使用app.config可以保存 ...

  7. [MySQL 5.1 体验]MySQL 实例管理器 mysqlmanager 初试

    原贴:http://imysql.cn/node/313 [MySQL 5.1 体验]MySQL 实例管理器 mysqlmanager 初试 周二, 2007/06/19 - 22:10 - yejr ...

  8. GraphX 图数据建模和存储

    背景 简单分析一下GraphX是怎么为图数据建模和存储的. 入口 能够看GraphLoader的函数. def edgeListFile( sc: SparkContext, path: String ...

  9. 强连通分量分解 Kosaraju算法 (poj 2186 Popular Cows)

    poj 2186 Popular Cows 题意: 有N头牛, 给出M对关系, 如(1,2)代表1欢迎2, 关系是单向的且能够传递, 即1欢迎2不代表2欢迎1, 可是假设2也欢迎3那么1也欢迎3. 求 ...

  10. 3. Spring Boot Servlet

    转自:https://blog.csdn.net/catoop/article/details/50501686