如何从另一个处理程序触发angularjs事件处理程序?

时间:2014-06-12 07:39:28

标签: javascript angularjs angularjs-directive angular-ui jquery-triggerhandler

我正在使用AngularJS 1.3.0-beta.2,jQuery 2.1.0,Angular UI 0.11,以及我自定义版本的Angular UI的Tooltip小部件,我希望工具提示中的按钮在点击时关闭工具提示。< / p>

Plunkr

关键部分是crud_tooltip.js:372:

  scope.closePopup = function() {
    var trigger = element.prev();
    if (scope.mode === 'timeout') {
      $timeout(function() {
        trigger.triggerHandler('click');
      });
    }
    else {
      trigger.triggerHandler('click');
    }
  };

使用$ timeout的版本有效,但点击按钮和看到弹出窗口关闭之间有明显的延迟。

不使用$ timeout的版本会出错: [$ rootScope:inprog] $ apply in progress in progress 。然后关闭弹出窗口......我不知道为什么。

当用户点击工具提示中的按钮时,如何修改closePopup(或调用它的ng-click)以立即关闭工具提示?

注意:我使用this Plunker作为指导,从Angular UI的工具提示代码中调整了我的custom_tooltip.js代码。我也试过直接更改tt_isOpen值并定义一个新的crudtooltip-toggle属性,两者都取得了非常有限的成功。

2 个答案:

答案 0 :(得分:1)

你正在看错了。

这种延迟来自其他地方并且绝对不受$ timeout限制,但也适用于notimeout方法(当然,忽略错误,但可以通过首先检查$scope.$$phase来轻松修复)。

此外,当您单击两个原始链接时,关闭延迟就在那里。

因此,在4种情况下,您会得到相同的延迟,这意味着它在代码中有所作为。如果我找到导致答案的原因,我会另外看一下并更新答案。

答案 1 :(得分:1)

也许我忽略了这一点,但是你的代码似乎非常复杂,并且因为这种简单的功能而令人费解。在任何情况下,延迟实际上是由$timeout等待一些动画完成。超时被触发,因为scope.tt_animation评估为真实。只需将crud_tooltip.js 258 行的超时更改为0即可解决问题。见this plunk

以下是问题区域:

            if ( scope.tt_animation ) {
              transitionTimeout = $timeout(removeTooltip, 500);
            } else {
              removeTooltip();
            }