首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular2 SVG xlink:href

Angular2 SVG xlink:href
EN

Stack Overflow用户
提问于 2016-01-29 18:51:59
回答 3查看 22K关注 0票数 48

我有渲染SVG图标的组件:

代码语言:javascript
复制
import {Component, Directive} from 'angular2/core';
import {COMMON_DIRECTIVES} from 'angular2/common';

@Component({
  selector: '[icon]',
  directives: [COMMON_DIRECTIVES],
  template: `<svg role="img" class="o-icon o-icon--large">
                <use [xlink:href]="iconHref"></use>
              </svg>{{ innerText }}`
})
export class Icon {
  iconHref: string = 'icons/icons.svg#menu-dashboard';
  innerText: string = 'Dashboard';
}

这会触发错误:

代码语言:javascript
复制
EXCEPTION: Template parse errors:
  Can't bind to 'xlink:href' since it isn't a known native property ("<svg role="img" class="o-icon o-icon--large">
<use [ERROR ->][xlink:href]=iconHref></use>
  </svg>{{ innerText }}"): SvgIcon@1:21

如何设置动态xlink:href

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-29 18:54:49

SVG元素没有属性,因此大多数时候都需要属性绑定(另请参阅Properties and Attributes in HTML)。

对于属性绑定,您需要

代码语言:javascript
复制
<use [attr.xlink:href]="iconHref">

代码语言:javascript
复制
<use attr.xlink:href="{{iconHref}}">

更新

清理可能会导致问题。

另请参阅

更新 DomSanitizationService将被重命名为DomSanitizer

更新此问题应得到修复

但是有一个悬而未决的问题来支持命名空间属性https://github.com/angular/angular/pull/6363/files

作为变通办法,添加一个额外的

代码语言:javascript
复制
xlink:href=""

Angular可以更新属性,但在添加时会出现问题。

如果xlink:href实际上是一个属性,那么在添加PR之后,您的语法也应该有效。

票数 89
EN

Stack Overflow用户

发布于 2016-07-27 05:49:25

我仍然对Gunter所描述的attr.xlink:href有问题,所以我创建了一个类似于SVG 4 Everybody但特定于angular2的指令。

用法

<div [useLoader]="'icons/icons.svg#menu-dashboard'"></div>

解释

此指令将

  1. 通过http
  2. 加载图标/icons.svg解析响应并提取路径信息以将已解析的svg图标加载到html

代码

代码语言:javascript
复制
import { Directive, Input, ElementRef, OnChanges } from '@angular/core';
import { Http } from '@angular/http';

// Extract necessary symbol information
// Return text of specified svg
const extractSymbol = (svg, name) => {
    return svg.split('<symbol')
    .filter((def: string) => def.includes(name))
    .map((def) => def.split('</symbol>')[0])
    .map((def) => '<svg ' + def + '</svg>')
}

@Directive({
    selector: '[useLoader]'
})
export class UseLoaderDirective implements OnChanges {

    @Input() useLoader: string;

    constructor (
        private element: ElementRef,
        private http: Http
    ) {}

    ngOnChanges (values) {
        if (
            values.useLoader.currentValue &&
            values.useLoader.currentValue.includes('#')
        ) {
            // The resource url of the svg
            const src  = values.useLoader.currentValue.split('#')[0];
            // The id of the symbol definition
            const name = values.useLoader.currentValue.split('#')[1];

            // Load the src
            // Extract interested svg
            // Add svg to the element
            this.http.get(src)
            .map(res => res.text())
            .map(svg => extractSymbol(svg, name))
            .toPromise()
            .then(svg => this.element.nativeElement.innerHTML = svg)
            .catch(err => console.log(err))
        }
    }
}
票数 3
EN

Stack Overflow用户

发布于 2020-03-24 17:25:23

我认为它可以使用角度管道功能来解决。

代码语言:javascript
复制
<use attr.xlink:href={{weatherData.currently.icon|iconpipe}}></use>

解释此管道将

  1. 将解析后的响应值传递给管道
  2. 返回完整的svg
  3. 将获得预期路径& svg将在html页面中呈现

以下是管道类型代码

代码语言:javascript
复制
import { PipeTransform, Pipe } from '@angular/core';

@Pipe({
    name: 'iconpipe'
})
export class IconPipe implements PipeTransform {
    constructor() { }

    transform(value: any) {
        let properIconName = undefined;

        switch (value) {
            case 'clear-day':
                properIconName = '/assets/images/weather-SVG-sprite.svg#sun';
                break;
            case 'clear-night':
                properIconName = '/assets/images/weather-SVG-sprite.svg#night-1';
                break;
            case 'partly-cloudy-day':
                properIconName = '/assets/images/weather-SVG-sprite.svg#cloudy';
                break;

            case 'partly-cloudy-night':
                properIconName = '/assets/images/weather-SVG-sprite.svg#night';
                break;

            case 'cloudy':
                properIconName = '/assets/images/weather-SVG-sprite.svg#cloud';
                break;

            case 'rain':
                properIconName = '/assets/images/weather-SVG-sprite.svg#rain';
                break;

            case 'sleet':
                properIconName = '/assets/images/weather-SVG-sprite.svg#snowflake';
                break;
            case 'snow':
                properIconName = '/assets/images/weather-SVG-sprite.svg#snowing';
                break;

            case 'wind':
                properIconName = '/assets/images/weather-SVG-sprite.svg#storm';
                break;
            case 'fog':
                properIconName = '/assets/images/weather-SVG-sprite.svg#sun';
                break;
            case 'humid':
                properIconName = '/assets/images/weather-SVG-sprite.svg#sun';
                break;
            default:
                properIconName = '/assets/images/weather-SVG-sprite.svg#summer';
        }
        return properIconName;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35082657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档