TL; DR:如果我用css改变DOM元素的大小,它的指令就不会注意到这一点,即使存在大小的监视。
我有几个自定义指令(simple-graph
),每个指令都包含svg
。我想要鼠标悬停的尺寸增加。尝试:
simple-graph {height: 100px;}
simple-graph:hover {height: 200px;}
(这部分有效。)
<simple-graph ng-repeat="data in datasets" sg-rst="data"></simple-graph>
angular.module('myApp').directive('simpleGraph', function () {
return {
restrict: 'E',
scope: {rst: '=sgRst'},
link: function (scope, el, attrs) {
//Add an svg element to el[0], do initialisation, etc. (not shown)
//Also, $watch rst to update graph when data is changed. (not shown)
//Watch size of simple-graph
scope.$watch(function(){
return el[0].clientWidth + el[0].clientHeight;
}, updateSize);
function updateSize() {
//update size of svg element, using el[0].clientHeight and .clientWidth (not shown).
}
}
};
});
由{c}文件中设置的高度变化引起的simple-graph
元素的大小调整,并未被指令中的scope.$watch
注意到。 问题:我可以以某种方式强行解雇吗?
sg-hover="hover" ng-mouseenter="hover=true" ng-mouseleave="hover=false"
,用于切换属性sg-hover
的值,scope
属性更改为scope: {rst: '=sgRst', hover: '=sgHover'}
到scope
,然后scope.$watch('hover', updateSize)
来注意这种切换。这很有效,并且表明updateSize
函数确实可以正常工作。但它非常复杂,我认为必须有更快的方法。所以,我的问题:我可以以某种方式强制$ watch函数在通过css更改元素客户端大小时触发吗?
谢谢!
答案 0 :(得分:0)
当我对这个问题发表评论时,我认为你不能用css达到你想要的效果(至少不是以简单的方式)
您可以将指令更改为此类指令,至少避免重复:
return {
restrict: 'E',
scope: {rst: '=sgRst'},
replace: true,
template: "<div ng-mouseover='hover=true' ng-mouseout:'hover=false' class='simple-graph' ng-class='{hover: hover}'><svg></svg></div>"
link: function (scope, el, attrs) {
//create or find the svg element to el[0], do initialisation, etc. (not shown)
//Also, $watch rst to update graph when data is changed. (not shown)
//Watch size of simple-graph
scope.$watch('hover', updateSize);
function updateSize() {
//update size of svg element, using el[0].clientHeight and .clientWidth (not shown).
}
}
然后将你的css改为:
.simple-graph .hover {
height: 200px
}