利用Angular elementRef实现一键复制功能

前言web

因为在以前有个项目须要实现一键复制功能,一开始大多数都会想着本身用js手写封着。后来发现angular有个机制,能够很简单的实现一键复制功能。浏览器

 

背景app

Angular 的口号是 - “一套框架,多种平台。同时适用手机与桌面 (One framework.Mobile & desktop.)”,即 Angular 是支持开发跨平台的应用,好比:Web 应用、移动 Web 应用、原生移动应用和原生桌面应用等。为了可以支持跨平台,Angular 经过抽象层封装了不一样平台的差别,统一了 API 接口。如定义了抽象类 Renderer 、抽象类 RootRenderer 等。此外还定义了如下引用类型:ElementRef、TemplateRef、ViewRef 、ComponentRef 和 ViewContainerRef 等。下面咱们就来分析一下 ElementRef 类:框架

 

ElementRef做用学习

在应用层直接操做 DOM,就会形成应用层与渲染层之间强耦合,致使咱们的应用没法运行在不一样环境,如 web worker 中,由于在 web worker 环境中,是不能直接操做 DOM。对web worker 有兴趣的能够去阅读了解下支持的类和方法。经过 ElementRef 咱们就能够封装不一样平台下视图层中的 native 元素 (在浏览器环境中,native 元素一般是指 DOM 元素),最后借助于 Angular 提供的强大的依赖注入特性,咱们就能够轻松地访问到 native 元素。this

首先,先对比下以前写的spa

<p id="copyText" title="内容" (click)="isShow = true" *ngIf="!isShow">内容</p>
        <textarea id="copyUp" (click)="isShow = false" *ngIf="isShow"> 内容</textarea>
        <span (click)="copyUrl(isShow ? 'copyUp' : 'copyText')">复制</span>
copyUrl(type) {
        let cont;
        if (type === 'copyUp') {
            $('#copyUp').select();
            document.execCommand('copy');
            cont = $('#copyUp').text();
        } else {
            $('#copyText').select();
            document.execCommand('copy');
            cont = $('#copyText').text();
        }
        let flag = this.copyText(cont);
        flag ? LayerFunc.successLayer('复制成功!') : LayerFunc.errorLayer('复制失败!');
    }
    copyText(text) {
        let textarea = document.createElement('input'); // 建立input对象
        let currentFocus = document.activeElement; // 当前得到焦点的元素
        document.body.appendChild(textarea); // 添加元素
        textarea.value = text;
        textarea.focus();
        let flag;
        if (textarea.setSelectionRange) textarea.setSelectionRange(0, textarea.value.length);
        // 获取光标起始位置到结束位置
        else textarea.select();
        try {
            flag = document.execCommand('copy'); // 执行复制
        } catch (eo) {
            flag = false;
        }
        document.body.removeChild(textarea); // 删除元素
        return flag;
    }
}

利用添加一个 textarea标签,经过textarea的select方法选中文本,而后再经过浏览器提供的copy 命令,将textarea中的内容复制下来的方法。code

 

再看看利用ElementRef实现的一键复制对象

首先去注册ElementRef接口

import { Component, OnInit, ElementRef } from '@angular/core';

而后在constructor引入

constructor(
        private elementRef: ElementRef
    ) {}

 

<input type="text" id="copy_value" vlaue="">内容
<button (click)="copyText(内容值)">复制</button>


 

copyText(text: string) {
      const input = this.elementRef.nativeElement.querySelector('#copy_value');
      input.value = text;
      input.select();
      document.execCommand('copy');
      LayerFunc.successLayer('复制成功');
    }

 

总结

在利用angular开发的时候能够多学习angular机制,会发如今一些功能的开发上,用好了它自身封好的方法,其实有不少地方能够避免没必要要代码,有时写原生的时候可能会过于繁杂,有些方法缺能够很简单的去帮你实现,减小了代码量。

相关文章
相关标签/搜索