Я создал настраиваемую привязку к атрибуту transform
моей группы svg
:
app.directive('ngScale', function () {
return function (scope, element, attrs) {
scope.$watch(attrs.ngScale, function (value) {
element.attr('transform', "scale(" + value + ")");
}, true);
};
});
<g ng-scale="{{vm.scale}}">...</g>
vm.doStuff = function () {
...
vm.scale *= 1.1;
}
<g ng-scale="1.1" transform="scale(1)">...</g>
При вызове doStuff
изменяется значение шкалы, и я вижу изменение атрибута ng-scale
в DOM, однако фактический атрибут transform
заполняется только при первом запуске и никогда не обновляется снова. Почему это так?
Чтобы заставить наблюдателя работать, не используйте интерполяцию (двойные фигурные скобки) при использовании этой директивы.
<g xd-scale="vm.scale">...</g>
angular.module('myApp').directive('xdScale', function () {
return function linkFn (scope, elem, attrs) {
scope.$watch(attrs.xdScale, function (value) {
console.log("Watch fired ", value);
elem.attr('transform', "scale(" + value + ")");
});
};
});
Аргумент attrs.xdScale
- это строка. Когда первый аргумент $watch
является строкой, функция watch оценивается как выражение AngularJS. Двойные фигурные скобки не работают в угловых выражениях.
Также, пожалуйста, не используйте ng-scale
в качестве названия директивы. ng-
зарезервирован для встроенных в AngularJS директив.
Чтобы увидеть, как работает директива, посетите ДЕМО на JSFiddle.