如何在IE10 +中使用AngularJS和内联交互式SVG?

时间:2015-02-26 23:50:15

标签: angularjs internet-explorer svg

内联SVG在Firefox和Chrome中运行良好。有些实例在IE10 +中工作,如果你运行plunker你会看到: http://plnkr.co/edit/CQ6HOtHxAlJd2hxoz1fa?p=preview

这是我的问题plunker: http://plnkr.co/edit/09FBW7EFk99vvXlpliLL?p=preview

tl; dp(太长,没有插入)细节: 此代码适用于IE:

      <form novalidate class="simple-form">
        Size: <input type="text" ng-model="size" /><br />
        Pos: <input type="text" ng-model="pos" /><br />
      </form>
      <svg xmlns="http://www.w3.org/2000/svg" version="1.1" height='400' width='400'>
        <square x='0' y='5' size='50' fill='blue'/>
        <rect x='{{pos}}' y='100' width='{{pos}}' height='{{size}}' fill='red'/>
      </svg>

此代码在IE中不起作用:

   <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" viewBox="0 0 360 240" preserveAspectRatio="xMidYMid meet"> 
        <g ng-repeat="zone in sst.zones">
            <g ng-if="zone.camera == 1" transform="scale(0.5)">
                <path d="M {{zone.geometry[0].x}}{{zone.geometry[0].y}} 
                           L {{zone.geometry[1].x}} {{zone.geometry[1].y}} 
                           {{zone.geometry[2].x}} {{zone.geometry[2].y}} 
                           {{zone.geometry[3].x}} {{zone.geometry[3].y}} Z" 
                    fill="none" stroke="red" stroke-width="2" />
            </g>
        </g>           
    </svg>          

我注意到当我查看渲染结果的来源时,d属性为空,即d =“”。有什么建议吗?

编辑:两个示例之间的主要区别之一是失败的示例嵌入在ngIncluded模板中。

1 个答案:

答案 0 :(得分:1)

我在这里找到了解决这个问题的方法:

Replacing (most of) d3.js with pure SVG + AngularJS

这是一篇写得很好,易于理解的文章,展示了将SVG与AngularJS集成的正确方法。修复是一个简单的改变。而不是使用d属性,在它前面加上ng-attr-因此它变为ng-attr-d =“...”这可以防止浏览器检测到SVG错误,直到AngularJS能够发挥它的魔力。

 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" viewBox="0 0 360 240" preserveAspectRatio="xMidYMid meet"> 
      <g ng-repeat="zone in sst.zones">
          <g ng-if="zone.camera == 1" transform="scale(0.5)">
              <path ng-attr-d="M {{zone.geometry[0].x}}{{zone.geometry[0].y}} 
                         L {{zone.geometry[1].x}} {{zone.geometry[1].y}} 
                         {{zone.geometry[2].x}} {{zone.geometry[2].y}} 
                         {{zone.geometry[3].x}} {{zone.geometry[3].y}} Z" 
                  fill="none" stroke="red" stroke-width="2" />
          </g>
      </g>           
  </svg>

编辑:针对IE修改了plunker解决问题(测试IE11)

http://plnkr.co/edit/j5lM0mTbawUBfZv26dlw?p=preview

另外需要注意的是,我发现在svg周围放置一个div包装,其style =“width:999px; height:999px”解决了IE发生的SVG扩展问题。请参阅上面的plunker。