Angular 5 - Panoya kopyala


125

Tıklandığında kullanıcının panosuna bir değişken kaydedecek bir simge uygulamaya çalışıyorum. Şu anda birkaç kitaplık denedim ve hiçbiri bunu yapamadı.

Angular 5'de bir değişkeni kullanıcının panosuna nasıl düzgün bir şekilde kopyalarım?


ngxyz-c2c'yi kullanabilirsiniz , bunu yapmanın birden fazla yolu vardır.
Ankit Singh

Angular Material kullanıyorsanız, 9.0.0 sürümü (6 Şubat 2020'de yayınlandı) kullanımı çok kolay pano paketini tanıttı . Angular belgelerine ve @ Nabel'in cevabına bakın .
George Hawkins

Yanıtlar:


236

1.Çözüm: Herhangi bir metni kopyalayın

HTML

<button (click)="copyMessage('This goes to Clipboard')" value="click to copy" >Copy this</button>

.ts dosyası

copyMessage(val: string){
    const 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);
  }

2.Çözüm: Bir TextBox'tan kopyalayın

HTML

 <input type="text" value="User input Text to copy" #userinput>
      <button (click)="copyInputMessage(userinput)" value="click to copy" >Copy from Textbox</button>

.ts dosyası

    /* To copy Text from Textbox */
  copyInputMessage(inputElement){
    inputElement.select();
    document.execCommand('copy');
    inputElement.setSelectionRange(0, 0);
  }

Demo Burada


3. Çözüm: Bir 3. taraf yönergesi olan ngx-clipboard'u içe aktarın

<button class="btn btn-default" type="button" ngxClipboard [cbContent]="Text to be copied">copy</button>

Çözüm 4: Özel Direktif

Özel bir direktif kullanmayı tercih ediyorsanız, Dan Dohotaru'nun yanıtını kontrol edin, bu da kullanılarak uygulanan zarif bir çözümdür ClipboardEvent.


1
Harika fikir, ama 2. çözümünüzü kopyaladım ve Cannot read property 'select' of undefinedaçısal 6'ya girmeye devam ediyorum . Bu açısal6 uyumlu mu?
slevin

1
@slevin Herhangi bir şekilde açısal versiyonla ilgili olduğunu düşünmüyorum. Girişinize "# userinput" eklediniz mi?
Sangram Nandkhile

1
@SangramNandkhile Tekrar tekrar kontrol ettim ama yine de aynı hata. Bu benim kodum <input *ngIf="invitation_code" type="text" readonly value="{{invitation_code}}" #userinput > <button *ngIf="code_success" (click)="copyInputMessage(userinput)" value="click to copy" > Copy code </button>Teşekkürler
slevin

Hatta kaldırabilir position, left, top, ve opacity. ve yerine birselBox.style.height = '0';
Mendy

küçük sorun, const kullanmamalı, izin vermeyin
Stephen DuMont

70

Bunun şimdiye kadar burada yüksek oranda oylandığını biliyorum, ancak özel bir yönerge yaklaşımını tercih ederim ve @jockeisorby'nin önerdiği gibi ClipboardEvent'e güvenirken, aynı zamanda dinleyicinin doğru bir şekilde kaldırıldığından emin olurum (aynı işlevin sağlanması gerekir) olay dinleyicileri ekleme ve kaldırma için)

Stackblitz demosu

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

@Directive({ selector: '[copy-clipboard]' })
export class CopyClipboardDirective {

  @Input("copy-clipboard")
  public payload: string;

  @Output("copied")
  public copied: EventEmitter<string> = new EventEmitter<string>();

  @HostListener("click", ["$event"])
  public onClick(event: MouseEvent): void {

    event.preventDefault();
    if (!this.payload)
      return;

    let listener = (e: ClipboardEvent) => {
      let clipboard = e.clipboardData || window["clipboardData"];
      clipboard.setData("text", this.payload.toString());
      e.preventDefault();

      this.copied.emit(this.payload);
    };

    document.addEventListener("copy", listener, false)
    document.execCommand("copy");
    document.removeEventListener("copy", listener, false);
  }
}

ve sonra onu olduğu gibi kullanın

<a role="button" [copy-clipboard]="'some stuff'" (copied)="notify($event)">
  <i class="fa fa-clipboard"></i>
  Copy
</a>

public notify(payload: string) {
   // Might want to notify the user that something has been pushed to the clipboard
   console.info(`'${payload}' has been copied to clipboard`);
}

Not: window["clipboardData"]anlamadığı için IE için gerekli olduğuna dikkat edine.clipboardData


3
Bunu yeniden kullanılabilir bir yönerge haline getirdiğiniz için teşekkür ederiz. İyi fikir!
Çubuk

1
gerçekten, sürüm 12.x ile başlayarak, Safari yine sorunlu :)
Dan Dohotaru

2
minimum geçici çözüm, bir aralık oluşturmak ve bu aralığı seçime eklemek olabilir, çalışan bir çözüm şu şekilde görünecektir: stackblitz.com/edit/angular-labs-copy-clipboard-r1
Dan Dohotaru

pencere ["clipboardData"] IE'de benim için tanımsız mı? Herhangi bir fikir ?
Victor Jozwicki

mobil cihazda çalışmıyor, bunun yerine ngx-clipboard eklentisini kullandım
the-catalin

50

Metni kopyalarken bunun çok daha temiz bir çözüm olduğunu düşünüyorum:

copyToClipboard(item) {
    document.addEventListener('copy', (e: ClipboardEvent) => {
      e.clipboardData.setData('text/plain', (item));
      e.preventDefault();
      document.removeEventListener('copy', null);
    });
    document.execCommand('copy');
  }

Ve sonra html'deki click olayında copyToClipboard'u çağırmanız yeterlidir. (Tık) = "copyToClipboard ( 'texttocopy')"


2
e.clipboardData tanımlı olmadığı için IE üzerinde çalışmaz.
Dan Dohotaru

9
dahası, orijinal dinleyicinin bir argüman olarak aktarılması gerektiğinden, kaldırma listesi de
çalışmaz

2
Kaldırma olay dinleyicisinin nasıl çalıştırılacağını öğrenmek için buraya bakın: stackoverflow.com/a/51843984/3849445
user123959

Angular 6'da iyi çalışıyor! Chrome'da test edildi. Teşekkür ederim.
moreirapontocom

16

Angular Material v9'dan itibaren artık bir pano CDK'sına sahip

Pano | Açısal Malzeme

Basitçe kullanılabilir

<button [cdkCopyToClipboard]="This goes to Clipboard">Copy this</button>

Mucizevi şekilde çalışır. Orada uygun bir çözüm olduğunu asla bilmiyordum!
Abdullah Feroz

1
Angular Material v9'dan temin edilebilir.
andreivictor

14

Jockeisorby'nin yanıtının, olay işleyicisinin düzgün şekilde kaldırılmamasını düzelten değiştirilmiş versiyonu.

copyToClipboard(item): void {
    let listener = (e: ClipboardEvent) => {
        e.clipboardData.setData('text/plain', (item));
        e.preventDefault();
    };

    document.addEventListener('copy', listener);
    document.execCommand('copy');
    document.removeEventListener('copy', listener);
}

1
Firefox'ta çalışmıyor. Hata -document.execCommand(‘cut’/‘copy’) was denied because it was not called from inside a short running user-generated event handler
OPTIMUS

3

Angular modülleri kullanarak bunu başarabilirsiniz:

navigator.clipboard.writeText('your text').then().catch(e => console.error(e));

1

Mesajı kopyalamak için aşağıdaki yöntem kullanılabilir: -

export function copyTextAreaToClipBoard(message: string) {
  const cleanText = message.replace(/<\/?[^>]+(>|$)/g, '');
  const x = document.createElement('TEXTAREA') as HTMLTextAreaElement;
  x.value = cleanText;
  document.body.appendChild(x);
  x.select();
  document.execCommand('copy');
  document.body.removeChild(x);
}

Bu gerçekten iyi bir çözüm. Uygulamam için denedim ve işe yaradı. Teşekkürler.
jaihind

1

Bunu Angular'da yapmanın ve kodu basit tutmanın en iyi yolu bu projeyi kullanmaktır.

https://www.npmjs.com/package/ngx-clipboard

    <fa-icon icon="copy" ngbTooltip="Copy to Clipboard" aria-hidden="true" 
    ngxClipboard [cbContent]="target value here" 
    (cbOnSuccess)="copied($event)"></fa-icon>

1

Açısal cdk kullanarak kopyalayın,

Module.ts

import {ClipboardModule} from '@angular/cdk/clipboard';

Bir dizeyi programlı olarak kopyalayın: MyComponent.ts,

class MyComponent {
  constructor(private clipboard: Clipboard) {}

  copyHeroName() {
    this.clipboard.copy('Alphonso');
  }
}

HTML yoluyla kopyalamak için bir öğeyi tıklayın:

<button [cdkCopyToClipboard]="longText" [cdkCopyToClipboardAttempts]="2">Copy text</button>

Referans: https://material.angular.io/cdk/clipboard/overview


0

İlk önerilen çözüm işe yarıyor, sadece değişmemiz gerekiyor

selBox.value = val;

için

selBox.innerText = val;

yani

HTML:

<button (click)="copyMessage('This goes to Clipboard')" value="click to copy" >Copy this</button>

.ts dosyası:

copyMessage(val: string){
    const selBox = document.createElement('textarea');
    selBox.style.position = 'fixed';
    selBox.style.left = '0';
    selBox.style.top = '0';
    selBox.style.opacity = '0';
    selBox.innerText = val;
    document.body.appendChild(selBox);
    selBox.focus();
    selBox.select();
    document.execCommand('copy');
    document.body.removeChild(selBox);
  }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.