1

我正在尝试构建 Angular UI Bootstrap工具提示的扩展版本,尽管它实际上更像是将$modal提供程序转换为工具提示提供程序

$modal我的意图是创建一个工具提示,它将拥有自己的控制器 - 与提供者可以完成的方式大致相同

我尝试像这样创建一个tooltipExtended指令:

    .directive('tooltipExtended', [ 'tooltipStack', '$timeout', function (tooltipStack, $timeout) {
        return {
                    restrict: 'EA',
                    scope: {
                        index: '@',
                        animate: '=',
                        placement: '@'
                    },
                    replace: true,
                    transclude: true,
                    templateUrl: function (tElement, tAttrs) {
                        return tAttrs.templateUrl || 'template/tooltip/extended.html';
                    },
                    link: function (scope, element, attrs) {
                        //....etc....
                    }
                };
            }
        ]);

    .directive('tooltipTransclude', function () {
        return {
            link: function ($scope, $element, $attrs, controller, $transclude) {
                $transclude($scope.$parent, function (clone) {
                    $element.empty();
                    $element.append(clone);
                });
            }
        };
    });

    angular.module("template/tooltip/extended.html", []).run(["$templateCache", function ($templateCache) {
        $templateCache.put("template/tooltip/extended.html",
          "<div tabindex=\"-1\" role=\"tooltip\" class=\"tooltip {{placement}}\" ng-class=\"{in: animate}\" ng-style=\"{'z-index': 1050 + index*10, display: 'block'}\" ng-click=\"close($event)\">\n" +
          "    <div class=\"tooltip\"><div class=\"tooltip-content\" tooltip-transclude></div></div>\n" +
          "</div>");
    }]);

然后使用tooltipStack(再次,基本上镜像$modalStack,只是没有 a backdrop) - 我在tooltipStack.open函数中执行以下操作:

        // ...
        var body = $document.find('body').eq(0);

        var angularDomEl = angular.element('<div tooltip-extended></div>');
        var index = openedTooltips.length() - 1;
        angularDomEl.attr({
            'template-url': tooltip.tooltipTemplateUrl,
            'tooltip-class': tooltip.tooltipClass,
            'index': index,
            'placement': tooltip.placement,
            'animate': 'animate'
        }).html(tooltip.content);

        var tooltipDomEl = $compile(angularDomEl)(tooltip.scope);
        // ...

当我这样做时,控制器似乎没有绑定到工具提示

如果我将其更改为使用现有的 Angular UI Bootstraptooltip指令(调用$tooltip提供程序),如下所示:

var angularDomEl = angular.element('<div tooltip></div>');

一切突然都正常了,但是查看 $tooltip 提供程序的编译函数,我不明白是什么造成了这种差异 - 唯一执行的代码基本上是$tooltip提供程序link返回的函数的构造逻辑$get

如果您好奇 - 要获取工具提示位置,此扩展依赖于angular.element($event.target)从用于触发工具提示的任何事件发送

有什么建议么?

4

0 回答 0