javascript - $watch 第二次值改变时没有触发

标签 javascript angularjs

使用 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);
          });
       };
     }
   }
});

我做了一个plunker来说明这种行为。如果打开控制台,您将看到以下内容:

  • 我监视的单元格正在初始化,您将获得第一个 scrollHeight (29)
  • 您点击“显示行”,控制台中的元素就会显示出来(这样您就可以检查 scrollHeight 值),$watch 就会被触发并显示更新值 (0) - 这是正确的,元素的 scrollHeight 为 0
  • 现在您单击“显示单元格”并获得元素(scrollHeight 已更改 (29))但是 $watch 不会触发该函数!?! - 只有当您再次点击“显示单元格”时,它才会被触发并显示错误的值 29!

我需要检测何时显示我的“Watch that”,但正因为如此,这是不可能的。

最佳答案

您可以使用 ng-if 而不是 ng-show ,添加和删除 DOM 将改变运行摘要周期,并且在摘要周期 watch 获取之后调用,然后正确计算元素的高度。

标记

<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>

Demo Plunkr

关于javascript - $watch 第二次值改变时没有触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30901635/

相关文章:

javascript - Node.js 的 libxmljs 的 Azure 部署错误

javascript - 预填充并提交隐藏表单

javascript - 使用括号表示法添加到关联数组时,ng-repeat 不会更新

angularjs - 我如何使用文本区域并通过 Angular Material 设计选择输入?

javascript - 如何通过命令行参数设置 Protractor chromeOptions

javascript - 此示例中的 ng-show 不起作用

javascript - 如何替换Vuejs路由器中的一个参数

javascript - 如何使用 javascript 设置 session 变量并通过 php 代码获取它

javascript - 全局函数中的 Angular 问题,自 beta 1.3.0b15 以来已损坏。需要帮助请

javascript - 如何将语言更改为多个文件而不是 i18next 中的一个文件?