指令写法,angular5官网文档给的很详细。

首先要创建一个文件,需注意命名规范(后缀名为xxx.directive.ts);

今天要记录的是在多个li中,右键点击之后显示出对应的菜单,直接上图吧!

右键点击在js中只需要这样写就行:

document.oncontextmenu = function(e){

  e.preventDefault();
};
但是在angular中,需要单独定义指令,用@Input进行数据绑定,传递给父元素值,再用@Output将此事件发射出去,让父元素能够接收到;
 
指令文件:

import {Directive, ElementRef, EventEmitter, Input, OnInit, Output} from "@angular/core";

@Directive({  
selector: '[cp-right-click]', //选择你
})
export class CPRightClickDirective implements OnInit{
@Input('cp-right-click') rightClick: number;//Input将数据从绑定表达式传达到指令中。
@Output() rightClickEvent: EventEmitter<any> = new EventEmitter();
constructor(public el: ElementRef){} //ElementRef注入到指令构造函数中。这样代码就可以访问 DOM 元素了。
ngOnInit(){
let self = this;
this.el.nativeElement.addEventListener('contextmenu', function (event) {
event.preventDefault();//阻止默认行为
self.rightClickEvent.emit(self.rightClick);//发射事件
})
}
} 父元素html文件:
<div nz-col [nzSpan]="3" *ngFor="let list of healList; let i = index" style="position: relative;">
<dl class="add-project-dl" >
<dt [cp-right-click]="i" (rightClickEvent)='rightClickHandler($event)' (mouseout)="hideCon(i)">
<img src="{{list.logopath}}"/>
<div class="play-group"
[style.display]="list.visible ? 'block' : 'none'"
(mousemove)="groupShow(i)"
(mouseout)="groupHide(i)">
<p (click)="editPlaFrom(list)">编辑</p>
<p (click)="delPlaFrom(list)">删除</p>
</div>
</dt>
<dd>{{list.name}}</dd>
</dl>
</div>
现在父元素接收到了子元素指令发射的事件,并绑定了rightClickHandler($event)事件,这时可以在父元素中定义事件,控制右键菜单的显示与隐藏;
注:定时器是为了控制鼠标划入划出时,菜单是否显示隐藏,相当于加了一层锁,滑到别处时,那么菜单操作就会被隐藏,同时又保证了流畅性;
this.healList = [];//循环肯定要有数组 此数组是动态渲染的   html中的 ‘let i = index’ 是为了获取点击元素的index
for(let i in data){
this.healList.push({
name: data[i].name,
linkpath: data[i].linkpath,
logopath: data[i].logopath,
id: data[i].id,
isdeleted: data[i].isdeleted,
visible: false
})
}
父文件中的事件:
rightClickHandler(clickIndex){
let self = this;
this.clearLockedTimeOut();
this. detailShowLock = setTimeout(function () {
self.healList.forEach(list => {
list.visible = false;
});
self.healList[clickIndex].visible = true;
}, 250);
}
//以下是划入划出控制事件
clearLockedTimeOut() {
let self = this;
if (this.detailShowLock) {
clearTimeout(self.detailShowLock);
}
if (this.detailCloseLock) {
clearTimeout(self.detailCloseLock);
}
}
hideCon(clickIndex){
let self = this;
this.clearLockedTimeOut();
this.detailCloseLock = setTimeout(function () {
self.healList[clickIndex].visible = false;
}, 250);
}
groupShow(clickIndex){
this.clearLockedTimeOut();
this.healList[clickIndex].visible = true;
}
groupHide(clickIndex){
let self = this;
this.clearLockedTimeOut();
this.detailCloseLock = setTimeout(function () {
self.healList[clickIndex].visible = false;
}, 250);
} 每天记录一点点 开心

 

angular5 自定义指令 输入输出 @Input @Output(右键点击事件传递)的更多相关文章

  1. label标签内含有input元素,点击事件会触发两次

    **label标签内含有input元素,点击事件会触发两次** 如果你的结构是label内写input实现点击文字时候input也有相应.并且,把事件设置在了label上,那么就会执行两次了. //h ...

  2. 自定义指令 格式化input数据为非负整数

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 自定义指令 限制input 的输入位数

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8 ...

  4. Vue自定义指令实现input限制输入正整数

    directive.js import Vue from 'vue' export default () => { Vue.directive('Int', { inserted: functi ...

  5. html 获取鼠标左键事件,滚轮点击事件,右键点击事件

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  6. 给ECharts添加右键点击事件,实现右键功能菜单

    由于项目的需要,使用ECharts 的力导向图来实现 整个EDW数据架构的血缘分析,由于ECharts并没有给组件定义有右键的事件,同时ECharts是开源的项目,所以研究了下源码,将ECharts2 ...

  7. Vue触发input选取文件点击事件

    CSS .upload-btn-box { margin-bottom: 10px; button { margin-right: 10px; } input[type=file] { display ...

  8. react添加右键点击事件

    1.在HTML里面支持contextmenu事件(右键事件).所以需要在组建加载完时添加此事件,销毁组建时移除此事件. 2. 需要增加一个state,名称为visible,用来控制菜单是否显示.在_h ...

  9. vue自定义指令v-scroll(directive)

    vue开发中,很多地方如果说都用到了某一方法,我们就可以进行指令化封装,通过自定义指令来实现这里通过两个例子说明vue-Directive的使用 1.v-focus 主要用来实现页面加载进来的时候文本 ...

随机推荐

  1. JComBox的用法

    JComboBox的使用: 类层次结构图:    java.lang.Object     --java.awt.Component      --java.awt.Container       - ...

  2. Highcharts 环境配置

    Highcharts 环境配置 本章节我们将为大家介绍如何在网页中使用 Highcharts. Highcharts 依赖于 jQuery,所以在加载 Highcharts 前必须先加载 jQuery ...

  3. spring security antMatchers相关内容

    一.antMatcher与antMatchers的区别以及使用场景 来源:https://stackoverflow.com/questions/35890540/when-to-use-spring ...

  4. PHPCMS V9完全开发介绍

    PHPCMS V9 文件目录结构: 根目录 | – api 接口文件目录 | – caches 缓存文件目录 | – configs 系统配置文件目录 | – caches_* 系统缓存目录 | – ...

  5. Mysql可重复读原理

    mysql可重复读现象及原理分析 InnoDB---可重复读隔离级别的底层实现原理 概念 可重复读的实现 Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插 ...

  6. windows的网上邻居

    要说以前中学最怕上什么课就是电脑课,要说电脑印象最深的是什么软件就是总摆在桌面又听不懂又点进去什么都没有的“网上邻居”. “网上邻居”指的是同一局域网内在线的的电脑,更简单些就是连在同一路由器中开机的 ...

  7. 把旧系统迁移到.Net Core 2.0 日记 (15) --Session 改用Redis

    安装Microsoft.Extensions.Caching.Redis.Core NuGet中搜索Microsoft.Extensions.Caching.Redis.Core并安装,此NuGet包 ...

  8. pre强制 自动换行

    转自:http://www.16sucai.com/2010/10/941.html <pre> 元素可定义预格式化的文本.被包围在 pre 元素中的文本通常会保留空格和换行符.而文本也会 ...

  9. vbox 虚拟机添加usb

    先装扩展包. vbox 所在的用户组比如要包括当前用户才行. 查看当前用户名:sharl@sharl-laptop:~$ whoamisharl 查看vbox 所在的组:sharl@sharl-lap ...

  10. 【Java算法】条件运算符

    利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. 条件运算符的表达式为: 表达式1?表达式2:表达式3 当表达式1为true ...