angular tutorial

Para copiar texto a clipboard o al portapapeles desde angular tenemos que usar execCommand, que es una api de js que no necesita permisos.

En angular no tenemos nativamente con ts algo parecido así que vamos a usar un poco de javascript nativo en nuestro código.

Copiando una llamada json

Para este ejemplo de copiar texto a clipboard vamos a hacer una llamada api rest y está llamada vamos a copiarlo al portapapeles directo

funciones en typescript

Antes de poner el código explicare un poco sobre esta api, podemos usar los comandos siguientes en execCommand

  • copy
  • paste
  • cut

Lo único que necesitamos es una sección de texto ya sea un textarea o un input, luego se selecciona y aplicamos el comando

var copyText = document.querySelector("#input");
  copyText.select();
  document.execCommand("copy");

en caso de Angular vamos a crear un elemento nuevo y luego borrarlo se vería de la siguiente manera

copyText(val: string){
    let selBox = document.createElement('textarea');
      selBox.style.position = 'fixed';
      selBox.style.left = '0';
      selBox.style.top = '0';
      selBox.style.opacity = '0';
      selBox.value = val;
      document.body.appendChild(selBox);
      selBox.focus();
      selBox.select();
      document.execCommand('copy');
      document.body.removeChild(selBox);
      this.copy = true;
      setTimeout(()=>{
        this.copy = false;
      }, 2000)
    }

con esto ya podemos pasar cual texto a copiar en portapapeles

al final de post pongo la página en vivo, ahora todo el código :

import { Component, OnInit, ViewChild, ElementRef } from '@angular/core';
import { ConsultasService } from './consultas.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  respuesta: string;
  copy: boolean;
  @ViewChild('urls', {static: false}) laurl: ElementRef;
  constructor(private servicio: ConsultasService){

  }
  ngOnInit() {
    
  }
  getConsultas(){
    let xxx = this.laurl.nativeElement.value;
    if(xxx.indexOf('http') != -1){
      this.servicio.getListas(this.laurl.nativeElement.value).subscribe(x => {
        this.respuesta = JSON.stringify(x);
        this.copyText(JSON.stringify(x));
      }, error =>{
        this.respuesta = 'Algo salio mal'
        this.copy = false;
      })

    }else {
      alert ('llenar con el formato correcto, abre consola para ejemplo');
      console.log('debe contener http o https por ejemplo https://www.mocky.io/v2/5185415ba171ea3a00704eed');

    }

  }
  copyText(val: string){
    let selBox = document.createElement('textarea');
      selBox.style.position = 'fixed';
      selBox.style.left = '0';
      selBox.style.top = '0';
      selBox.style.opacity = '0';
      selBox.value = val;
      document.body.appendChild(selBox);
      selBox.focus();
      selBox.select();
      document.execCommand('copy');
      document.body.removeChild(selBox);
      this.copy = true;
      setTimeout(()=>{
        this.copy = false;
      }, 2000)
    }
  
}

app component html

<div class="cabeza">
    <h1>Copiar llamadas de api rest a portapapeles </h1>
</div>
<section>
    <div class="url">
        <p>Inserte url completa</p>
        <div>
            <input type="text" #urls placeholder="http://llamada.com/pruebarestjson" />
            <button (click)="getConsultas()">Consultar</button>
        </div>


    </div>
    <div *ngIf="respuesta != null" class="respuesta">
        <div *ngIf="copy">
            <p>Copiado en clipboard</p>
        </div>
        <p>{{respuesta}}</p>
    </div>



</section>

style app component

.cabeza {
    width: 100%;
    text-align: center;
    display: flex;
    justify-content: center;
    align-items: center;
    flex-direction: column;
    margin-bottom: 50px;
}

textarea {
    width: 100%;
    height: auto;
    background-color: transparent;
    resize: none;
}

section {
    width: 100%;
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
    justify-content: center;
}

.url {
    width: 40%;
    display: flex;
    flex-direction: column;
}

.url input {
    border: 0;
    border-bottom: 1px solid white;
    background-color: transparent;
    color: white;
    width: 70%;
    height: 30px;
}

.url input:focus {
    outline: 0;
}

button {
    cursor: pointer;
}

.respuesta {
    overflow: auto;
    width: 50%;
    border: 1px solid black;
    padding: 2px;
    background-color: rgba(255, 255, 255, 0.3);
    color: black;
}

Servicios

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';


@Injectable({
  providedIn: 'root'
})
export class ConsultasService {

  constructor(private api: HttpClient) { }
  getListas(url: string): Observable <any>{
    //let domain = window.location.hostname;
    return this.api.get(url)
  }
}

Código en vivo para copiar texto a clipboard

Si estás interesado en saber mas de Angular te recomiendo esta sección del blog.

También te invitamos a entrar en nuestro canal de telegram.

por Cesar Flores

Programador de tiempo completo, Gamer de medio tiempo y fotógrafo ocasionalmente, me gusta el front-end y mi framework favorito es angular aunque no por eso le hago el feo a un nuevo lenguaje.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.