有没有办法通过点击外部来关闭Angular UI工具提示?

时间:2015-04-13 17:25:50

标签: javascript angularjs angular-ui angular-ui-bootstrap

为了获得这种能力,我扩展了工具提示提供者。

function customTooltip($document, $tooltip) {
    var tooltip = $tooltip('customTooltip', 'customTooltip', 'click'),
        parentCompile = angular.copy(tooltip.compile);

    tooltip.compile = function (element, attrs) {
        var parentLink = parentCompile(element, attrs);

        return function postLink(scope, element, attrs) {
            var firstTime = true;

            parentLink(scope, element, attrs);

            var onDocumentClick = function () {
                if (firstTime) {
                    firstTime = false;
                } else {
                    element.triggerHandler('documentClick');
                }
            };

            var bindDocumentClick = function () {
                $document.on('click', onDocumentClick);
            };

            var unbindDocumentClick = function () {
                $document.off('click', onDocumentClick);
            };

            scope.$watch('tt_isOpen', function (newValue) {
                firstTime = true;

                if (newValue) {
                    bindDocumentClick();
                } else {
                    unbindDocumentClick();
                }
            });

            scope.$on('$destroy', function onTooltipDestroy() {
                unbindDocumentClick();
            });
        };
    };

    return tooltip;
}

但是这种方法已经不起作用了,因为现在范围内没有tt_isOpen属性。实际上,我只能看到我的父作用域中的任何工具提示属性。我猜这是因为tooltip.js 124行https://github.com/angular-ui/bootstrap/blob/master/src/tooltip/tooltip.js#L124的变化。现在有什么方法可以通过点击外部来关闭工具提示,或者至少获得isOpen标志?

3 个答案:

答案 0 :(得分:1)

pull request为工具提示和弹出窗口实现outsideClick触发器。它将包含在angular-ui 1.0.0中,预计将在今年年底发布。实施后,您只需将tooltip-trigger="outsideClick"添加到元素中即可。

答案 1 :(得分:0)

有一个打开拉取请求Here来添加此功能。您可以尝试的黑客解决方法是禁用然后启用触发器元素,因为指令将调用此方法:

        attrs.$observe( 'disabled', function ( val ) {
          if (val && ttScope.isOpen ) {
            hide();
          }
        });

答案 2 :(得分:0)

此变体适用于角度1.3.15和角度ui版本0.13

function customTooltip($document, $tooltip) {
    var tooltip = $tooltip('customTooltip', 'customTooltip', 'click'),
        parentCompile = angular.copy(tooltip.compile);

    tooltip.compile = function (element, attrs) {

        var parentLink = parentCompile(element, attrs);

        return function postLink(scope, element, attrs) {

            parentLink(scope, element, attrs);

            var isOpened = false;

            element.bind('click', function () {
                bindDocumentClick();
            });

            var onDocumentClick = function () {
                if (!isOpened) {
                    isOpened = true;
                } else {
                    element.triggerHandler('documentClick');
                    unbindDocumentClick();
                    isOpened = false;
                }
            };

            var bindDocumentClick = function () {
                $document.on('click', onDocumentClick);
            };

            var unbindDocumentClick = function () {
                $document.off('click', onDocumentClick);
            };

            scope.$on('$destroy', function onTooltipDestroy() {
                unbindDocumentClick();
            });
        };
    };

    return tooltip;
}