javascript
  • angularjs
  • svg
  • angularjs-material
  • 2017-08-09 61 views 0 likes 
    0

    我建立在角材料的應用,並具有MD-圖標結構如下:

    <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> 
    

    但它不能呼叫負載爲角塊https://www.w3.org/2000/svg (我試過HTTP和HTTPS),並拋出一個$ SCE:insecurl錯誤:

    Error description

    由於文檔建議,我嘗試添加的URL SCE白名單:

    app.config(function ($sceDelegateProvider) { 
        $sceDelegateProvider.resourceUrlWhitelist(['self', 'https://www.w3.org/2000/svg', 'https://*.w3.org/**']) 
    }) 
    

    但它沒有效果。

    我該如何讓它工作?

    請注意,我簡化了HTML以僅顯示相關內容,實際上我基於變量動態更改填充顏色,所以我寧願不將每個SVG都保存爲文件,前提是我可以使此動態版本正常工作。

    +3

    注:雖然該字符串看起來像一個URL,但它不是一個真正的。這只是'xmlns'的常量,意思是「這是一個SVG」。將其更改爲「https」會在技術上破壞它。 –

    +0

    @PaulLeBeau謝謝,這很好。請注意,它並不適用於http,儘管如此,Angular將它作爲URL阻止,出於某種原因 – Hankrecords

    回答

    1

    我打算假設您在運行時生成該SVG字符串,而不是像上面那樣對其進行硬編碼?否則,您將無法更改填充顏色。

    即,所以像這樣:

    md-svg-src='{{generateIcon()}} ... 
    

    這是正確的嗎?

    如果是這樣,那麼你有沒有嘗試Base64編碼的SVG?

    generateIcon() { 
        svgStr = "whatever"; 
        return "data:image/svg+xml;base64," + base64(svgStr); 
    } 
    

    也許有更好的Angular方法來解決這個問題。但這可能是一種可能的解決方法。

    +0

    並非如此,SVG本身就像它在答案中的樣子,唯一的區別是「填充」屬性就像fill =「{{(var1 ==='red')''#ff0000':'#0000ff'}}」而不是普通的顏色。我在CodePen中開發了一個頁面,然後將其插入到我的主應用程序中,並且它工作正常,所以它不會成爲SVG本身的問題 – Hankrecords

    +0

    我不得不創建一個函數來執行此操作,但是將內容轉換爲像您說的base64解決了這個問題。謝謝! – Hankrecords

    相關問題