简体   繁体   中英

Binding HTML attribute in angularjs

I have this code:

<span data-icon="{{table.addIcon || '&#xe603;'}}"></span>

That span creates an icon like this:

加上图标

However, I want to give the developer using this directive, the possibility to define a new icon. It is working, however, the problem I have is that, supposing I have this:

$scope.table.addIcon = "&#xe070;"

Instead of creating the element

<span data-icon="&#xe070;"></span> 

it will create it

<span data-icon="&amp;#xe070;"></span>

Which will fail to add the icon, so instead of seeing this:

我应该拥有什么......

What I have is this:

我有什么:(

Is there a way to avoid angular to convert the & into &amp; ?

Adding solution

Thanks to miensol the solution is this:

.directive("changeIcon", function() {
    var d = document.createElement("div");
    return {
        restrict: "A",
        link: function($scope, $ele, $attrs) {
            log($attrs);
            var originalIcon;
            $scope.decodedIcon = $attrs.icon;
            do {
                originalIcon = $scope.decodedIcon;
                d.innerHTML = originalIcon;
                $scope.decodedIcon = d.firstChild.nodeValue;
            } while (originalIcon != $scope.decodedIcon);
            $attrs.$set('data-icon', $scope.decodedIcon);
        }
    }
})

And it is used like this:

<span change-icon icon="{{table.addIcon || '&#xe603;'}}"></span>

I've created a sample jsfiddle to try out the problem you described but I probably am missing something.

I suspect you're seeing &amp; instead of & because view is html encoded on server .

Either way it's fairly easy to decode html entities in javascript. Consider following example:

m.directive('icon', function(){
    var div = document.createElement('div');

    return {
        scope: {
            icon:'='
        },
        link: function($scope,$element,$attrs){            
            var originalIcon;
            $scope.decodedIcon = $scope.icon;
            do {
                originalIcon = $scope.decodedIcon;
                div.innerHTML = originalIcon;
                $scope.decodedIcon = div.firstChild.nodeValue;
            } while (originalIcon != $scope.decodedIcon); 
            console.log('data-icon', $scope.decodedIcon);
            $attrs.$set('data-icon', $scope.decodedIcon);
        }
    };
});

You can play around with it here hope it helps solve your problem.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM