angular5 自定义指令 输入输出 @Input @Output(右键点击事件传递)

指令写法,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’ 是为了获取点击元素的indexfor(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);}

每天记录一点点 开心

 

原文地址:https://www.cnblogs.com/fmixue/p/8398550.html

时间: 2024-10-08 19:43:42

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

自定义的cell中如果存在着UIButton,那如何将点击事件传递出去呢?

自定义cell后,将indexPath参数传递到自定义的cell中(NSIndexPath为cell的一个retain的属性),自定义的cell申明一个协议,里面提供了一个方法 - (void)touchEventAtIndexPath:(NSIndexPath *)indexPath; ...... @property (nonatomic, assign) id<AppTableViewCellDelegate>delegate; // 将事件传递出去 ...... - (void)but

目录树加载并绑定右键点击事件

1 using System.Collections; 2 using System.Drawing; 3 using System.IO; 4 using System.Linq; 5 using System.Windows.Forms; 6 7 namespace menuTreeWITHrightMouseClick 8 { 9 public partial class Form1 : Form 10 { 11 string strRootFolderPath = @"D:\CODE&q

在使用自定义指令的时候,使用了一个引用传递的值来管理状态

就是在外部的控制器里面定义了一个变量,然后把它传给自定义组件.在自定义组件里面修改了.因为是引用传递.按道理组件里面改了,外面也会改.也会响应的是吧.但是我遇到的一个问题是.我在指令里面改了这个变量.然后在指令里面立马调用了外部控制器里面的方法此时变量的更改没有反应到外部控制器.出现了延时的状况.这时候我用$timeout为0就能解决.然后就能同步.这个坑其实我也不知道什么原因.可能和他angular里面的机制有关系吧.

android 自定义带按钮的Notification及点击事件和伸缩通知栏

1.自定义一个带按钮的Notification布局:layout_notification: 2.创建Notification: RemoteViews views = new RemoteViews(getPackageName(),R.layout.layout_nitification); //自定义的布局视图 //按钮点击事件: PendingIntent homeIntent = PengdingIntent.getBroadcast(this,1,new Intent("action

移动端弹出软键盘导致input光标和点击事件错位问题

我遇到的问题:在微信浏览器里,点击蒙层的input框,弹出软键盘,蒙层被顶上去,同时input的焦点和button的点击事件也被顶上去了,软键盘消失,蒙层回到原位,但是点击input和button均没反应,点击蒙层被顶上去的位置有反应,因为input的焦点和button的点击事件没回到原位.这个问题出现在ios中,android手机没问题. 以下是一位大佬写的解决方法,解决了我的问题. 原文地址:https://blog.csdn.net/Doubleu_/article/details/865

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

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" con

vue自定义指令clickoutside使用以及扩展用法

vue自定义指令clickoutside使用以及扩展用法 产品使用vue+element作为前端框架.在功能开发过程中,难免遇到使用element的组件没办法满足特殊的业务需要,需要对其进行定制,例如要求选择器的弹出框中,增加搜索过滤(跟目前element的输入建议不太一样).于是想说说之前修改element组件,并定制为业务组件过程中遇到的问题. ps:因为对某些组件改动很大,所以是直接拷贝了一份源码,然后再进行修改,但是这样会遇到挺多问题,建议对于vue组件如果改动不大,只是简单功能扩展,就

MFC树形控件的使用(右键点击)

概述 在MFC中,会用到树形控件,这里做下记录. 右键点击 1.添加右键点击事件(NM_RCLICK) 2.获得鼠标在Client的坐标 1 CPoint point; 2 GetCursorPos(&point);//获得鼠标在屏幕上的坐标 3 ::ScreenToClient(m_trdPageTree.GetSafeHwnd(),&point);//屏幕坐标转化为客户端坐标 3.测试该坐标点是否点中树形控件节点 1 UINT uFlags; 2 uFlags = TVHT_ONITE

vue.js 学习四(指令和自定义指令)

官方的指令说明已经很简单了,这里再写一遍,也是自己加深一下印象 v-text 就是写入单纯的文本,可以忽略这个指令直接双花括号代替 <span v-text="msg"></span> <!-- 和下面的一样 --> <span>{{msg}}</span> v-html 更新元素的 innerHTML,如果取回的值里面包含了html的样式,可以使用这个指令. 以下抄写了官方注意事项,对于用户输入的HTML,显示的时候需要谨慎