Использование Angular ng-класса с d3.js для элемента svg

Попытка использовать angular ng-class с библиотека d3js в svg, но безуспешно.

HTML

<div ng-controller="MainCtrl">

  <div id="svgContainer"></div>
  <button id="swicthBtn" ng-click="switchStatus();" class="btn">Switch status</button>

</div>

CSS

*, *:before, *:after {
  bounding-box: border-box;
}

#svgContainer {
  width: 400px;
  height: 400px;
  background-color: #333;
}

.btn {
  margin: 1em;
  padding: 1em;
}

.active {
  fill: red;
}

.inactive {
  fill: #666;
}

JS

var app = angular.module("myApp", []);

app.controller("MainCtrl", ["$scope", function($scope) {

    $scope.status = true;
  $scope.switchStatus = function() {
    $scope.status = !$scope.status;
  }

  var svg = d3.select("#svgContainer").append("svg")
    .attr("width", 400)
    .attr("height", 400);

  var rect = svg.append("rect")
    .attr("x", 150)
    .attr("y", 150)
    .attr("width", 100)
    .attr("height", 100)
    .attr("ng-class", "status ? 'active' : 'inactive'");

}]);

Это jsfiddle. Есть 2 класса css, активный и неактивный, которые я хотел бы динамически назначать прямоугольнику svg на основе значения переменной $scope.status. На самом деле это не работает. Я пробовал некоторые варианты выражения ng-класса, например:

"{status ? 'active' : 'inactive'}" 

or

"{'status' ? 'active' : 'inactive'}" 

но ни один не работал.

Директива ng-class не поддерживается для элементов svg или я делаю что-то не так?


person revy    schedule 18.09.2017    source источник


Ответы (1)


Вы пытаетесь использовать ng-класс в качестве атрибута, не компилируя его сначала с помощью angular.

Angular не прослушивает этот атрибут автоматически. Вам нужно будет вызвать $compile(svg)($scope) для полученного svg, чтобы angular сделал свое «волшебство».

$compile Angular Service

Также не забудьте вызвать angular для элемента dom, а не для обернутого элемента d3.

Рабочая скрипта JS

person PiniH    schedule 18.09.2017