angulaire.js - problème de compilation d'Angularjs
漂亮男人
漂亮男人 2017-05-15 17:01:34
0
2
514

Parce que mon ng-bind-html utilise ng-click, je dois utiliser compile, mais les documents que j'ai lus écrivent tous dans la directive. Le problème est que j'utilise compile dans le filtre. Comment l'utiliser en ligne ? Aucune ressource ne peut être trouvée du tout.

app.filter('httpClickFilter',function($sce){
        return function(inputText){
            var textHttpArray = inputText.split('http');
            textHttpArray[textHttpArray.length-1] = textHttpArray[textHttpArray.length-1] + ' ';
            for(var i = 1;i < textHttpArray.length; i++){
                var textSubstring = 'http' + textHttpArray[i].substring(0,textHttpArray[i].indexOf(' '));
                var replaceTextHttp = "<span style='color:#fe7979' ng-click='httpLinkClick()'>"+textSubstring+"</span>";
                inputText = inputText.replace(textSubstring,replaceTextHttp);
            }
            return $sce.trustAsHtml(inputText);
        }
    })

HTML : <span ng-bind-html="item.text | httpClickFilter"></span>

La signification générale est la suivante : interceptez un champ de texte, recherchez le lien http à l'intérieur et modifiez le lien HTTP pour qu'il soit cliquable. Vous pouvez utiliser des filtres ici !

漂亮男人
漂亮男人

répondre à tous(2)
PHPzhong

http://stackoverflow.com/questions/19726179/how-to-make-ng-bind-html-compile-angularjs-code

Supplément

Si vous effectuez simplement une conversion de données, utiliser le filtre ici est sans aucun doute le bon choix. Mais vous êtes impliqué dans une liaison d'événement dynamique comme ng-click Pour le moment, il n'est pas approprié d'utiliser un filtre pour gérer cette exigence. Le filtre effectue un traitement supplémentaire sur notre entrée, ciblant les données. Notez qu'il cible les données. Si vous utilisez le filtre pour traiter la logique de rendu, cela viole le principe de responsabilité unique. de la conception angulaire du filtre.

OK, si vous insistez pour l'écrire dans le filtre, alors la méthode httpLinkClick ne peut être accrochée que sur $rootScope, il n'y a pas d'autre choix, HACK une implémentation

app.filter('httpClickFilter', function ($sce, $compile, $rootScope) {
    $rootScope.httpLinkClick = function () {
        console.log(234);
    };

    return function (inputText) {
        var textHttpArray = inputText.split('http');
        textHttpArray[textHttpArray.length - 1] = textHttpArray[textHttpArray.length - 1] + ' ';
        for (var i = 1; i < textHttpArray.length; i++) {
            var textSubstring = 'http' + textHttpArray[i].substring(0, textHttpArray[i].indexOf(' '));
            var replaceTextHttp = "<span style='color:#fe7979' ng-click='httpLinkClick()'>" + textSubstring + "</span>";
            inputText = inputText.replace(textSubstring, replaceTextHttp);
        }

        return $sce.trustAsHtml($compile('<p>' + inputText + '</p>')($rootScope).html());
    }
});

Mais malheureusement, cela ne sert à rien, car trustAsHtml gère tous les événements liés.

Évidemment, ce besoin doit être implémenté à l'aide d'instructions. Vous devez comprendre que chaque fonction a son propre scénario d'utilisation.

app.directive('httpClick', function ($compile) {
    return {
        restrict: 'A',
        scope: {
            contents: '=httpClick'
        },
        link: function (scope, element, attrs) {
            var inputText = scope.contents;
            var textHttpArray = inputText.split('http');
            textHttpArray[textHttpArray.length - 1] = textHttpArray[textHttpArray.length - 1] + ' ';
            for (var i = 1; i < textHttpArray.length; i++) {
                var textSubstring = 'http' + textHttpArray[i].substring(0, textHttpArray[i].indexOf(' '));
                var replaceTextHttp = "<span style='color:#fe7979' ng-click='httpLinkClick()'>" + textSubstring + "</span>";
                inputText = inputText.replace(textSubstring, replaceTextHttp);
            }

            element.html($compile(inputText)(scope));
        },
        controller: function ($scope) {
            $scope.httpLinkClick = function () {

            }
        }
    }
})

Digression

Si le texte provient d'une saisie utilisateur, vous devez faire attention aux attaques XSS. Essayez d'utiliser le texte suivant

.
$scope.text = 'http://www.baidu.com<script>alert(4)</script>';
过去多啦不再A梦

http://stackoverflow.com/a/18149450/2586541

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal