Как $скомпилировать директиву для динамически созданного элемента SVG

#angularjs #svg #d3.js

#angularjs #svg #d3.js

Вопрос:

Я пытаюсь добавить директиву контекстного меню к динамически созданному элементу SVG.

В контроллере AngularJS я определяю свой svg следующим образом:

 var svg = d3.select("#svg-canvas").append("svg")
    .attr("width", 100)
    .attr("height", 100)
    .style("pointer-events", "all")
    .append('g');
  

Позже я добавил к нему прямоугольник, как показано ниже. Обратите внимание, что я добавляю атрибут «ng-context-menu», моей директивы AngularJS.

 svg.append("rect")
.attr("x", 35)
.attr("y", 15)
.attr("width", 20)
.attr("height", 20)
.attr("ng-context-menu", "")
.style("fill", "gray");
  

Я добавляю этот код после загрузки DOM, таким образом, этот код не компилируется с помощью AngularJS. Это означает, что контекстное меню не привязано к элементу.

Я добавляю полный рабочий код в JSFiddle, на случай, если вы захотите проверить 🙂

У вас есть какие-либо предложения, чтобы заставить это работать? Нужно ли мне создавать директиву для этого?

Ответ №1:

Вы можете внедрить службу $compile и использовать ее для компиляции #svg-canvas.

 $compile(angular.element('#svg-canvas'))($scope);
  

Проверьте обновленный JSFiddle

Если вы хотите скомпилировать любой элемент d3, используйте

 $compile(element[0][0])(scope)
  

Вы можете найти ее здесь JSFiddle (но имейте в виду, что в этом фрагменте фактически скомпилирован элемент ‘g’, а не весь svg)

Комментарии:

1. GrizzlyNetch, спасибо за ваш ответ. Они оба работают. Однако, когда я хочу зайти в меню, меню исчезло. Есть ли у вас какие-либо идеи по устранению этой проблемы?

2. Хорошо… У вас есть это в директиве в событии mouseleave. Проверьте это: jsfiddle.net/aZB5F/6 Я прокомментировал обработчик события mouseleave 🙂

3. Спасибо @JakubKnejzlik, я также решил свою проблему, следуя вашему предложению