为什么我需要使用超时?

Why i need to use timeout?

我正在使用 AngularJS 和 angular-数据表库。 我需要在单击行时调用模式。 这是我的部分代码:

  function rowCallback(nRow, aData, iDisplayIndex, iDisplayIndexFull) {
    // Unbind first in order to avoid any duplicate handler (see https://github.com/l-lin/angular-datatables/issues/87)
    $('td', nRow).unbind('click');
    $('td', nRow).bind('click', function() {
      console.log(aData.title);
      $timeout(function(){
        Modal.showModal({
         template : 'views/Modal.html',
         Data : aData
         });
      }, 0);
    });
    return nRow;
  }

console.log 函数在任何情况下都可以正常工作,但调用模态函数只有在超时时才会按预期工作。那么有人可以解释为什么会这样吗?为什么只有第一个功能有效?如有任何解释,我将不胜感激。

您需要 $timeout 的原因是因为您正在使用带有 angular 函数的 jQuery 事件。这通常是一个坏主意,并且违反了 angular 的设计原则 - 请改用 ng-click

如果您必须将 jQuery 和 angular 混合在一起,请通过让 angular 知道 jQuery 事件来确保您正确地做到这一点,以便它可以触发它摘要循环。

您可以通过几种方式触发摘要,但最简单(并且最明显的是您的代码在做什么)是使用 $scope.$apply:

$scope.$apply(function () {

  Modal.showModal({
   template : 'views/Modal.html',
   Data : aData
  });

});

$timeout 起作用的原因是因为 $timeout 是一个 angular 包装函数,作为其实现的一部分触发摘要循环(它实际上非常类似于 $scope.$apply,但是当您稍后查看代码时,它在做什么/为什么需要它不太明显,所以我建议改用 $scope.$apply

延伸阅读:ng-book.

没有浏览器渲染引擎完成页面渲染的回调。

但是呈现页面是由事件队列处理的。通过使用 $timeout 函数,您将 Modal.showModal 分配给事件队列的 end - 在已经排队的页面呈现方法之后。

因此 Modal.showModal 将在页面呈现并正常工作后调用。