Ich weiß, dass dies hier bereits hoch bewertet wurde, aber ich würde mich lieber für einen benutzerdefinierten Direktivenansatz entscheiden und mich auf das ClipboardEvent verlassen, wie von @jockeisorby vorgeschlagen, und gleichzeitig sicherstellen, dass der Listener korrekt entfernt wird (dieselbe Funktion muss bereitgestellt werden) für die Listener zum Hinzufügen und Entfernen von Ereignissen)
Stackblitz- Demo
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);
}
}
und dann als solches verwenden
<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`);
}
Hinweis: Beachten Sie, dass das window["clipboardData"]
für IE benötigt wird, da es nicht verstehte.clipboardData