我正在尝试构建 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)
从用于触发工具提示的任何事件发送
有什么建议么?