web-dev-qa-db-fra.com

Copie AngularJS dans le presse-papiers

Existe-t-il un moyen de créer un bouton de copie avec une fonction de copie qui copiera tout le contenu d'un modal et vous pouvez le coller dans le bloc-notes

18
user3799365

J'avais besoin de cette fonctionnalité dans mon Controller, comme le texte à copier est dynamique, voici ma fonction simple basée sur le code du module ngClipboard :

function share() {
    var text_to_share = "hello world";

    // create temp element
    var copyElement = document.createElement("span");
    copyElement.appendChild(document.createTextNode(text_to_share));
    copyElement.id = 'tempCopyToClipboard';
    angular.element(document.body.append(copyElement));

    // select the text
    var range = document.createRange();
    range.selectNode(copyElement);
    window.getSelection().removeAllRanges();
    window.getSelection().addRange(range);

    // copy & cleanup
    document.execCommand('copy');
    window.getSelection().removeAllRanges();
    copyElement.remove();
}

P.S.
Nous vous invitons à ajouter un commentaire maintenant me disant à quel point il est difficile de manipuler DOM à partir d'un contrôleur .

16
marmor

Si vous avez le support jquery, utilisez cette directive

.directive('copyToClipboard', function () {
        return {
            restrict: 'A',
            link: function (scope, elem, attrs) {
                elem.click(function () {
                    if (attrs.copyToClipboard) {
                        var $temp_input = $("<input>");
                        $("body").append($temp_input);
                        $temp_input.val(attrs.copyToClipboard).select();
                        document.execCommand("copy");
                        $temp_input.remove();
                    }
                });
            }
        };
    });

Html

<a href="" copy-to-clipboard="Text to copy">Copy text</a>
8
byteC0de

si vous ne voulez pas ajouter une nouvelle bibliothèque à votre projet et que vous la créez par vous-même, voici une solution simple et facile:

note: je l'ai créé avec la fonctionnalité promesse (ce qui est génial)

voici CopyToClipboard.js module file

angular.module('CopyToClipboard', [])
        .controller('CopyToClipboardController', function () {

        })
        .provider('$copyToClipboard', [function () {

            this.$get = ['$q', '$window', function ($q, $window) {
                var body = angular.element($window.document.body);
                var textarea = angular.element('<textarea/>');
                textarea.css({
                    position: 'fixed',
                    opacity: '0'
                });
                return {
                    copy: function (stringToCopy) {
                        var deferred = $q.defer();
                        deferred.notify("copying the text to clipboard");
                        textarea.val(stringToCopy);
                        body.append(textarea);
                        textarea[0].select();

                        try {
                            var successful = $window.document.execCommand('copy');
                            if (!successful) throw successful;
                            deferred.resolve(successful);
                        } catch (err) {
                            deferred.reject(err);
                            //window.Prompt("Copy to clipboard: Ctrl+C, Enter", toCopy);
                        } finally {
                            textarea.remove();
                        }
                        return deferred.promise;
                    }
                };
            }];
        }]);

c'est tout, grâce à https://Gist.github.com/JustMaier/6ef7788709d675bd82

maintenant utilisons-le

angular.module('somthing')
   .controller('somthingController', function ($scope, $copyToClipboard) {
       // you are free to do what you want
            $scope.copyHrefToClipboard = function() {
            $copyToClipboard.copy(/*string to be coppied*/$scope.shareLinkInfo.url).then(function () {
                //show some notification
            });
        };
   }

et enfin le HTML

<i class="fa fa-clipboard" data-ng-click="copyHrefToClipboard($event)"></i>

j'espère que cela vous fait gagner du temps

8

Vous pouvez utiliser un module que j'ai créé, ngClipboard. Voici le lien https://github.com/nico-val/ngClipboard

Vous pouvez utiliser la directive ng-copyable Ou la fabrique ngClipboard.toClipboard().

3