使用AngularJS解析SVG

时间:2013-07-26 20:57:50

标签: angularjs svg

我是AngularJS和SVG的新手,所以如果我做了一件非常错误的事情,我道歉。

我正在尝试使用AngularJS创建一个SVG模式:

代码小提琴: http://jsfiddle.net/WFxF3/

模板:

<svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg">
    <defs>
        <pattern id="grid" width="{{cubeWidth}}" height="{{cubeHeight}}" patternUnits="userSpaceOnUse">
            <path d="M 0 0 L 0 {{cubeHeight}}" fill="none" stroke="gray" stroke-width="1" stroke-opacity="0.5"/>
            <path d="M 0 0 L {{cubeWidth}} 0" fill="none" stroke="gray" stroke-width="1" stroke-opacity="0.5"/>
            <!--<rect width="80" height="80" stroke="red" stroke-width="20" stroke-opacity="0.5" fill="white"/>-->
        </pattern>

    </defs>

    <rect width="100%" height="100%" fill="url(#grid)"/>
</svg>

控制器:

'use strict';

angular.module('gridifyApp')
  .controller('MainCtrl', function ($scope) {

        var docWidth = document.width;
        var columns = 12;
        var cubeWidth = docWidth / columns;
        var cubeHeight = 44;

        $scope.cubeWidth = cubeWidth;
        $scope.cubeHeight = cubeHeight;
  });

它似乎工作但我得到一个控制台错误: console error for angularJS view

任何想法为什么?

2 个答案:

答案 0 :(得分:16)

问题是svg在angular能够做任何事情之前被解析,因此双角花括号的值在angular到达它之前是无效的。 Angular的团队已经添加了一种定义某种“延迟绑定”的方法。您可以通过在ng-attr-前添加所需属性来使用它。它等待直到绑定评估有效并添加具有适当值的真实属性。 在你的情况下,它将是:

<svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg">
    <defs>
        <pattern id="grid" ng-attr-width="{{cubeWidth}}" ng-attr-height="{{cubeHeight}}" patternUnits="userSpaceOnUse">
            <path ng-attr-d="M 0 0 L 0 {{cubeHeight}}" fill="none" stroke="gray" stroke-width="1" stroke-opacity="0.5"/>
            <path ng-attr-d="M 0 0 L {{cubeWidth}} 0" fill="none" stroke="gray" stroke-width="1" stroke-opacity="0.5"/>
            <!--<rect width="80" height="80" stroke="red" stroke-width="20" stroke-opacity="0.5" fill="white"/>-->
        </pattern>

    </defs>

    <rect width="100%" height="100%" fill="url(#grid)"/>
</svg>

不应再有任何错误。请记住更新角度版本。

答案 1 :(得分:2)

SVG解析在AngularJS可以设置任何变量之前发生。您可以尝试以编程方式创建SVG: