我已将自定义指令绑定到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;
}
调用doStuff后<g ng-scale="1.1" transform="scale(1)">...</g>
对doStuff
的调用会更改比例值,我可以在DOM中看到ng-scale
属性更改,但实际的transform
属性仅在首次运行时填充,并且从不更新再次。为什么会这样?
答案 0 :(得分:0)
为了让观察者工作,在使用指令时不要使用插值(双花括号)。
<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表达式。双花括号不适用于Angular表达式。
另外请不要使用ng-scale
作为指令的名称。 ng-
前缀保留给AngularJS内置指令。
要查看该指令的有效性,请访问DEMO on JSFiddle。