使用AngularJS,我试图$watch
指令中scrollHeight
元素的scrollHeight
(隐藏在两个表中)。这种行为很奇怪;第一次值改变时,它会触发我的功能。第二次它没有,然后它的效果很好......
<table>
<tbody>
<tr>
<td ng-click="show()" style="cursor:pointer">Show Row</td>
</tr>
<tr>
<td>
<table ng-show="showRow">
<tbody>
<tr>
<td ng-click="showTD()" style="cursor:pointer">Show Cell</td>
</tr>
<tr ng-show="showCell">
<td id="tracker" tracker=""> Watch that</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
我正在观看双人桌:
myApp.directive('tracker', function() {
return {
compile : function(elem, attr, linker) {
return function(scope, elm, attrs) {
scope.$watch(function(){ return elm[0].scrollHeight }, function(){
console.log(elm[0].scrollHeight);
});
};
}
}
});
我的观察指示:
scrollHeight
我制作了一个plunker来说明这种行为。如果您打开控制台,您将看到以下内容:
scrollHeight
(29)$watch
值)并触发scrollHeight
并显示更新的值(0) - 这是正确的,元素&#39; s { {1}}为0 scrollHeight
已经改变了(29))但是$ watch没有触发这个功能!?! - 只有当您再次点击“显示单元格”时才会这样做。它被触发并显示错误的29值!每当我的“观看”时,我都需要检测到。得到显示,但由于这一点,这是不可能的。
答案 0 :(得分:1)
你可以使用ng-if
而不是ng-show
来解决这个问题,添加和删除DOM会改变运行摘要周期,&amp;在消化循环监视被调用之后,然后正确计算元素的高度。
<强>标记强>
<table ng-show="showRow">
<tbody>
<tr>
<td ng-click="showTD()" style="cursor:pointer">Show Cell</td>
</tr>
<tr ng-if="showCell">
<td id="tracker" tracker=""> Watch that</td>
</tr>
</tbody>
</table>