Angular.js: svg рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ "рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдорд╛рдиреНрдп рдорд╛рди" рддреНрд░реБрдЯрд┐рдпрд╛рдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 13 рдЬреВрди 2012  ┬╖  14рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: angular/angular.js

рдХреНрд░реЛрдо рд╕рдВрд╕реНрдХрд░рдг "20.0.1132.27 рдмреАрдЯрд╛" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рд▓реЗрдХрд┐рди рдЕрдиреНрдп рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рднреА рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ)

рдЗрд╕ рдПрдЪрдЯреАрдПрдордПрд▓ рдХреЗ рд▓рд┐рдП (рдЬрд╛рд╣рд┐рд░ рд╣реИ рдпрд╣ рдореВрд▓ рд╕реЗ рд╕рд░рд▓реАрдХреГрдд рд╣реИ):

<html ng-app>
  <head>
    <script src="http://code.angularjs.org/angular-1.0.0rc12.min.js"></script>
  </head>
  <body>
    <svg xmlns="http://www.w3.org/2000/svg" version="1.1">
      <rect x="{{0}}" y="{{0}}" width="{{100}}" height="{{100}}" fill="red"/>
    </svg>
  </body>
</html>

рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЖрдпрдд рдЦреАрдВрдЪрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрдВрд╕реЛрд▓ рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ:

рддреНрд░реБрдЯрд┐: рдХреЗ рд▓рд┐рдП рдЕрдорд╛рдиреНрдп рдорд╛рдирд╡рд┐рд╢реЗрд╖рддрд╛ x="{{0}}" рдмрдЧред рдПрдЪрдЯреАрдПрдордПрд▓:7
рддреНрд░реБрдЯрд┐: рдХреЗ рд▓рд┐рдП рдЕрдорд╛рдиреНрдп рдорд╛рдирд╡рд┐рд╢реЗрд╖рддрд╛ y="{{0}}" рдмрдЧ. рдПрдЪрдЯреАрдПрдордПрд▓:7
рддреНрд░реБрдЯрд┐: рдХреЗ рд▓рд┐рдП рдЕрдорд╛рдиреНрдп рдорд╛рдирд╡рд┐рд╢реЗрд╖рддрд╛ рдЪреМрдбрд╝рд╛рдИ = "{{100}}" рдмрдЧред рдПрдЪрдЯреАрдПрдордПрд▓:7
рддреНрд░реБрдЯрд┐: рдХреЗ рд▓рд┐рдП рдЕрдорд╛рдиреНрдп рдорд╛рдирд╡рд┐рд╢реЗрд╖рддрд╛ рдКрдВрдЪрд╛рдИ = "{{100}}" рдмрдЧред рдПрдЪрдЯреАрдПрдордПрд▓:7

рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рд╕реЗ рдкрд╣рд▓реЗ рдЖрддреЗ рд╣реИрдВред рд╡реЗ рд╣рд╛рдирд┐рд░рд╣рд┐рдд рд▓рдЧрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рднрдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдПрдирдЬреА-рд░рд┐рдкреАрдЯ рдХреЗ рдХрд╛рд░рдг рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдХреБрдЫ рд╣рдЬрд╝рд╛рд░ рдРрд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ - http://dave.whipp.name/tutorial/anti-alias.html рджреЗрдЦреЗрдВ)ред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рджрд░рдЕрд╕рд▓, рдЗрди рджрд┐рдиреЛрдВ (AngularJS 1.5) рдЖрдк рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ "ng-attr-" рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП:

<rect x="{{0}}" y="{{0}}" fill="red"/>

рдмрди рдЬрд╛рдПрдЧрд╛:

<rect ng-attr-x="{{0}}" ng-attr-y="{{0}}" fill="red"/>

рд╕рднреА 14 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдХреНрдпрд╛ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдирд┐рд░реНрджреЗрд╢ рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдХреЛрдгреАрдп рддрдХрдиреАрдХ рд╣реИ? рдПрдирдЬреА-рдХреНрд▓реЛрдХ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред

рдЕрдлрд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реА рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ рд╣реВрдВред рд╕рдВрднрд╡рддрдГ рдХреНрд░реЛрдо рдПрд╕рд╡реАрдЬреА рдХрд╛ "рдореВрд▓реНрдпрд╛рдВрдХрди" рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдПрдВрдЧреБрд▓рд░рдЬреЗрдПрд╕ рдХреЗ рдкрд╛рд╕ рдбреЛрдо рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рдФрд░ рдЧрдбрд╝рдмрдбрд╝ рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рд╣реЛ? (рдФрд░ рдПрдВрдЧреБрд▓рд░ рдХреА рдорджрдж рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ "<[ 100+v.row*100 ]>" рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рд╕реА рд╕рдВрдЦреНрдпрд╛ рддрдХ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред

рдореЗрд░реА рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рдереАред рдЕрдВрдд рдореЗрдВ, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдирд┐рд░реНрджреЗрд╢ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛:

angular.module('yourmodule.directives', [])
    .directive('ngX', function() {
        return function(scope, element, attrs) {
            scope.$watch(attrs.ngX, function(value) {
                element.attr('x', value);
            });
        };
    })

рдлрд┐рд░, рдХрд╛ рдЙрдкрдпреЛрдЧ ng-x рдХреЗ рдмрдЬрд╛рдп рд╡рд┐рд╢реЗрд╖рддрд╛ x :

<circle ng-x="{{ x }}" y="0" r="5"></circle>

рдЕрдВрдд рдореЗрдВ рдХрд╖реНрдЯрдкреНрд░рдж рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓ рдЧрдпрд╛ред

рдпрд╣ рдПрдХ рдмреЗрд╣рддрд░реАрди рдЙрдкрд╛рдп рд╣реИред рдореБрдЭреЗ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдирд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдореБрдЭреЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рд╕рдореВрд╣ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред

рдзрдиреНрдпрд╡рд╛рджред

рдЗрд╕реА рддрд░рд╣ ngHref рдФрд░ ngSrc рдХреЗ рд▓рд┐рдП рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

angular.forEach(['x', 'y', 'width', 'height'], function(name) {
  var ngName = 'ng' + name[0].toUpperCase() + name.slice(1);
  myModule.directive(ngName, function() {
    return function(scope, element, attrs) {
      attrs.$observe(ngName, function(value) {
        attrs.$set(name, value); 
      })
    };
  });
});

@mtiller рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рдореБрдЭреЗ рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рд╕рдореВрд╣ рднреА рдмрдирд╛рдирд╛ рдерд╛ред рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ @rkirov рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ, рдЖрдк рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@rkirov рдореИрдВрдиреЗ рдХрднреА рднреА

рдЙрд╕ рд╕реНрдирд┐рдкреЗрдЯ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, @rkirov , рд╕реБрдкрд░ рд╕рд╣рд╛рдпрдХ! рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдЬреАрдм рд╕рдорд╕реНрдпрд╛: рдпрджрд┐ рдЖрдк рдЗрд╕реЗ "рдбреА" рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдорд╛рди рдХреЛ рдЦрд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк elem.setAttribute("d", "") рдЬрд╣рд╛рдВ elem рдПрдХ path рддрддреНрд╡ рд╣реИ , рдХреНрд░реЛрдо рддреНрд░реБрдЯрд┐ рдХрдВрд╕реЛрд▓ рдореЗрдВ Error: Problem parsing d="" ред рд▓реЗрдХрд┐рди http://www.w3.org/TR/SVGTiny12/paths.html#DAttribute рдХреЗ рдЕрдиреБрд╕рд╛рд░ d="" рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдиреНрдп рд╣реИ, рдФрд░ рдпрд╣ рдкрде рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рдЖрдкрдХреЛ рдХрднреА-рдХрднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдХрд┐рд╕реА рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рд╡реЗрдмрдХрд┐рдЯ рдмрдЧ рд╣реИ?

рдХреНрдпрд╛ рдпрд╣ рд╡реЗрдмрдХрд┐рдЯ рдмрдЧ рд╣реИ?

рд╣рд╛рдБ ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ #1925 рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдПрдХ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдиреЛрдЯрд┐рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдХреНрд╖рдорд╛ рдХрд░реЗрдВред

рдПрдХ рд▓рдВрдмрд┐рдд рдкреАрдЖрд░ (https://github.com/angular/angular.js/pull/2061) рд╣реИ рдЬреЛ рдЗрд╕реЗ рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рджреЗрд░ рд╕реЗ рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЬреИрд╕рд╛ рдХрд┐ @skivvies рдиреЗ рдмрддрд╛рдпрд╛, d="" рдмрд╛рд░реЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдПрдХ рд╡реЗрдмрдХрд┐рдЯ рдмрдЧ рд╣реИ ...

рдмрдврд╝рд┐рдпрд╛ рдЙрдкрд╛рдп рд╡рд┐рд╕рд┐рд░рд┐рд╕рдВрдерд╛рдиред рд╡рд┐рд╢реЗрд╖рддрд╛ 'рдбреА' рдкрд░ рдПрдХ рд╣реА рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд░реЗрдЦрд╛ рдЦреАрдВрдЪрддреЗ рд╕рдордп рдореБрдЭреЗ рдПрдХ рд╣реА рддреНрд░реБрдЯрд┐ "рдЕрдкреЗрдХреНрд╖рд┐рдд рдореВрд╡рдЯреЛ рдкрде рдХрдорд╛рдВрдб ('рдПрдо' рдпрд╛ 'рдПрдо') рдХреЛрдгреАрдп" рд╣реЛ рд░рд╣реА рдереАред

angular.module('yourmodule.directives', [])
.directive('ngD', function () {
    return function (scope, element, attrs) {
        scope.$watch(attrs.ngD, function (value) {
            element.attr('d', value);
        });
    };
});

рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж

рджрд░рдЕрд╕рд▓, рдЗрди рджрд┐рдиреЛрдВ (AngularJS 1.5) рдЖрдк рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ "ng-attr-" рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП:

<rect x="{{0}}" y="{{0}}" fill="red"/>

рдмрди рдЬрд╛рдПрдЧрд╛:

<rect ng-attr-x="{{0}}" ng-attr-y="{{0}}" fill="red"/>

рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

рддреНрд░реБрдЯрд┐: рдХреЗ рд▓рд┐рдП рдЕрдорд╛рдиреНрдп рдорд╛рдирд╡рд┐рд╢реЗрд╖рддрд╛ x1="{{viewBox.x1}}"рддреНрд░реБрдЯрд┐: рдХреЗ рд▓рд┐рдП рдЕрдорд╛рдиреНрдп рдорд╛рдирд╡рд┐рд╢реЗрд╖рддрд╛ y1="{{viewBox.y1}}"

рдЖрдк X1 рдФрд░ y1 рдХреЛ ng-attr-x1 рдФрд░ ng-attr-y1

ngAttr рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, $interpolate рдХреЗ allOrNothing рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЗрдВрдЯрд░рдкреЛрд▓реЗрдЯреЗрдб рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдХреЛрдИ рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджреЗрддреА рд╣реИ, рддреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИ рдФрд░ рддрддреНрд╡ рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ

рдпрд╣ d рдХреЛ ng-attr-d . рд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ

рдзрдиреНрдпрд╡рд╛рдж рдкреАрдЯрд░рдЭрд╛рд░реНрдЯ, рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛ред рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдореИрдВрдиреЗ рдПрдХ рд▓рд┐рдВрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдпрд╛ рдФрд░ рдлрд┐рд░ рдШрдЯрдХ рдХреЛ $onInit рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

nosideeffects picture nosideeffects  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

guyandtheworld picture guyandtheworld  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

butchpeters picture butchpeters  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jetta20162 picture jetta20162  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

gkalpak picture gkalpak  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ