Polymer(1.0) - 动态使用xlink:href $ inside模板不能正常工作

时间:2015-10-15 11:07:07

标签: html dom svg polymer web-component

我有一个自定义页脚栏( tabfooter ),它会在其中创建一组内嵌SVG的按钮(出于样式原因,它的内联)。

我不想将所有SVG的完整代码放入属性中,所以我只需要移交一些ID,组件使用这些id来自行确定路径。

<custom-tabfooter values="{" ids ":["A ","B ","C ","D "]}"></custom-tabfooter>

然后组件获取内部带有ID数组的对象,并使用它来重复所需的DOM元素:

<dom-module id="custom-tabfooter">

  <template>

    <template is="dom-repeat" items="{{values.ids}}">
      <button id$="[[addButtonID(item)]]" class$="[[addButtonClass(item)]]">
        <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">

          <!--<use xlink:href="../assets/img/svg/A-icon.svg#path"></use>-->
          <use xlink:href$="[[replaceSVGPath(item)]]"></use>

        </svg>
      </button>
    </template>

  </template>

  <script>
    Polymer({
      is: "custom-tabfooter",
      properties: {
        values: Array
      },
      ready: function() {
        console.log(this.values.ids);
      },
      addButtonID: function(item) {
        return "btn-footer-icon-" + item;
      },
      addButtonClass: function(item) {
        return "btn-footer-icon btn-" + item;
      },
      replaceSVGPath: function(item) {
        return "../assets/img/svg/" + item + "-icon.svg#path";
      }
    });
  </script>

</dom-module>

这是按预期工作的。但是当谈到SVG时,我感到困惑。有一行注释掉:

<!--<use xlink:href="../assets/img/svg/A-icon.svg#path"></use>-->

这条线实际上有效。虽然它只使用内部标记加载一个静态SVG。

当我尝试加载动态SVG内容时,它会无声地失败,因为没有抛出任何错误,也没有加载任何SVG:

<use xlink:href$="[[replaceSVGPath(item)]]"></use>

然而输出非常相似:

<use xlink:href="../assets/img/svg/A-icon.svg#path"></use>

<use class="style-scope custom-tabfooter" xlink:href="../assets/img/svg/A-icon.svg#path"></use>

唯一可见的区别是聚合物为该元素添加了类。

有人有想法吗?

thanks.Rob

2 个答案:

答案 0 :(得分:3)

解决方法是除了绑定

之外还静态添加属性
 <use xlink:href="" xlink:href$="[[replaceSVGPath(item)]]"></use>

Polymer在创建属性时遇到问题,如果它已经存在,它可以更新它。

答案 1 :(得分:1)

这是Polymer的一个问题。 SVG使用命名空间属性。要正确设置它们,您需要调用setAttributeNS,但Polymer的属性绑定不支持名称空间,因此它们无法设置这些属性。

这是作为问题#3060提交的。