0

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

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

4

2 回答 2

0

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

如果您必须将 jQuery 和 Angular 混合在一起,那么请确保通过让 Angular 了解 jQuery 事件来正确执行此操作,以便它可以触发其摘要循环。

您可以通过几种方式触发摘要,但最简单的(也是最明显的代码正在执行的操作)是使用$scope.$apply

$scope.$apply(function () {

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

});

之所以$timeout有效,是因为$timeout它是一个角度包装函数,它触发一个摘要循环作为其实现的一部分(它实际上$scope.$apply与建议$scope.$apply改用)。

进一步阅读:ng-book

于 2015-10-14T10:33:16.170 回答
0

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

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

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

于 2015-10-14T10:34:35.530 回答