AngularJS ng-href and svg xlink

后端 未结 7 1468
一向
一向 2020-12-13 17:53

I\'d like some input on using xml namespaced attributes with angular.

The problem is angular comes with a couple of directives to handle writing attributes such as h

相关标签:
7条回答
  • 2020-12-13 18:14

    This took me more time than I would've wanted. Around 20-30 minutes.

    If I understand correctly, any failed loading on image element will render that element useless in the future. I believe it's something similiar @GeekyMonkey is saying. If angular binding system has set xlink:href initially to null, Image element wont work anymore, even if we have valid value in the future.

    Here is solution, notice how I have wrapped image element inside g element, using ng-if directive. That makes sure we will bind against image only when a correct value is available.

    <g ng-if="vm.svgMap.background != null">
        <image
            ng-attr-xlink:href="{{vm.svgMap.background.image | trusted}}"
            ng-attr-width="{{vm.svgMap.background.width}}"
            ng-attr-height="{{vm.svgMap.background.width}}"
    
            xlink:href=""
    
            width="1"
            height="1"
            x="0"
            y="0"></image>
    </g>
    

    As others said, the order of attributes are important as well. To ensure that angularJS allows us to bind image element, we'll also have to trust that resource, I've done it through filter (it's the one in xlink:href attribute):

    (function() {
        'use strict';
    
        angular.module('myTool').filter('trusted', TrustedFilter);
    
        function TrustedFilter($sce) {
            return function(url) {
                return $sce.trustAsResourceUrl(url);
            };
        };
    }());
    
    0 讨论(0)
  • 2020-12-13 18:22

    You can use ng-attr-<some attribute>

    ng-attr-xlink:href="{{xxx}}" works for me.


    Note that you also need an empty xlink:href="" as initial value. – Derek Hsu

    0 讨论(0)
  • 2020-12-13 18:22

    I ran into a similar problem when trying to output a value for xlink:href that's tied to the model. Based on the user's chosen <option> in a <select> control, I was trying to show a dynamic SVG icon via the xlink:href attribute of the <use> element.

    I found a thread about this in the GitHub Issues for AngularJS. Based on the discussion there, it appears that because a viable workaround exists, they've effectively tabled a fix by moving it to the Backlog milestone.

    What ultimately worked for me was inspired by this JSBin:

    http://jsbin.com/sigoleya/1/edit?html,js,output

    Here's the code I used in my template:

    <svg class="icon" data-ng-class="category.iconName">
      <use xlink:href="" data-ng-href="{{'#' + category.iconName}}">
    </svg>
    

    Given a category.iconName of icon-music, for example, Angular sets the xlink:href dynamically to #icon-music, which references the <svg id="icon-music"> element further up on the same page.

    As others have noted, what's key is setting a blank xlink:href="" attribute on the element where you call the ngHref directive. Attribute order does not seem to matter. Using ng-attr-xlink:href="{{xxx}}" (as mentioned in Derek Hsu's answer) did not work for me.

    All of this assumes Angular 1.3.36.

    0 讨论(0)
  • 2020-12-13 18:24

    I ran into this problem where I was using Ajax to load the svg spritesheet onto the page. If I had a on the page before the spritesheet was loaded, it would fail and would not resolve once the spritesheet was avaialble. Any added to the dom after the spritesheet was loaded were fine. I had to delay putting the items in the dom until after the spritesheet finished loading.

    This only affected IOS. All other browsers didn't care about the order.

    0 讨论(0)
  • 2020-12-13 18:26

    For anyone else having this problem due to Angular/Angular UI Router in HTML5 mode, I came up with a straightforward fix to enable svg sprite icons to work with their xlink:href attribute and the tag.

    Gist is here: https://gist.github.com/planetflash/4d9d66e924aae95f7618c03f2aabd4a3

    app.run(['$rootScope', '$window', function($rootScope, $window){
     $rootScope.$on('$locationChangeSuccess', function(event){
        $rootScope.absurl = $window.location.href;
    });
    
    <svg><use xlink:href="{{absurl+'#svgvID'}}"></use></svg>
    
    0 讨论(0)
  • 2020-12-13 18:36

    If, like me, you're looking for a way to add images to svg, you can do so adding:

    xlink:href="" ng-href="{{ foo }}"
    

    Example:

    http://jsbin.com/sigoleya/1/edit?html,js,output

    Where I found the solution:

    https://github.com/angular/angular.js/issues/7697

    0 讨论(0)
提交回复
热议问题