Angular 阻止 svg xmlns 作为 $sce:insecurl
Angular blocks svg xmlns as $sce:insecurl
我正在 Angular Material 构建一个应用程序,并且有一个 md-icon 结构如下:
<md-icon class="ic1" md-svg-src='data:image/svg+xml,
<svg xmlns="https://www.w3.org/2000/svg" viewBox="0 0 32 32">
<ellipse ry="16" rx="16" id="svg_1" cy="16" cx="16" stroke-width="1.5" fill="#ff0000"/>
</svg>' class="s32">
</md-icon>
但它无法加载,因为 Angular 阻止了对 https://www.w3.org/2000/svg
的调用(我已经尝试了 HTTP 和 HTTPS)并抛出 $sce:insecurl 错误:
正如文档所建议的那样,我尝试将 url 添加到 SCE 白名单中:
app.config(function ($sceDelegateProvider) {
$sceDelegateProvider.resourceUrlWhitelist(['self', 'https://www.w3.org/2000/svg', 'https://*.w3.org/**'])
})
但是没有效果。
我怎样才能让它发挥作用?
请注意,我已将 HTML 简化为仅显示相关内容,实际上我会根据变量动态更改填充颜色,因此如果可以的话,我宁愿不将每个 SVG 保存为文件这个动态版本可以工作。
我假设您是在运行时生成 SVG 字符串,而不是像上面那样对其进行硬编码?否则你将无法更改填充颜色。
即。所以像:
md-svg-src='{{generateIcon()}} ...
对吗?
如果是这样,那你试过用Base64编码SVG吗?
generateIcon() {
svgStr = "whatever";
return "data:image/svg+xml;base64," + base64(svgStr);
}
也许有更好的Angular方法来解决这个问题。但这可能是一个可行的解决方法。
我正在 Angular Material 构建一个应用程序,并且有一个 md-icon 结构如下:
<md-icon class="ic1" md-svg-src='data:image/svg+xml,
<svg xmlns="https://www.w3.org/2000/svg" viewBox="0 0 32 32">
<ellipse ry="16" rx="16" id="svg_1" cy="16" cx="16" stroke-width="1.5" fill="#ff0000"/>
</svg>' class="s32">
</md-icon>
但它无法加载,因为 Angular 阻止了对 https://www.w3.org/2000/svg
的调用(我已经尝试了 HTTP 和 HTTPS)并抛出 $sce:insecurl 错误:
正如文档所建议的那样,我尝试将 url 添加到 SCE 白名单中:
app.config(function ($sceDelegateProvider) {
$sceDelegateProvider.resourceUrlWhitelist(['self', 'https://www.w3.org/2000/svg', 'https://*.w3.org/**'])
})
但是没有效果。
我怎样才能让它发挥作用?
请注意,我已将 HTML 简化为仅显示相关内容,实际上我会根据变量动态更改填充颜色,因此如果可以的话,我宁愿不将每个 SVG 保存为文件这个动态版本可以工作。
我假设您是在运行时生成 SVG 字符串,而不是像上面那样对其进行硬编码?否则你将无法更改填充颜色。
即。所以像:
md-svg-src='{{generateIcon()}} ...
对吗?
如果是这样,那你试过用Base64编码SVG吗?
generateIcon() {
svgStr = "whatever";
return "data:image/svg+xml;base64," + base64(svgStr);
}
也许有更好的Angular方法来解决这个问题。但这可能是一个可行的解决方法。