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.

